Title: [196101] trunk/Source
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];
 }
     
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to