summaryrefslogtreecommitdiff
path: root/Source/WebKit2/NetworkProcess
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-11-09 12:15:52 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2012-11-09 12:16:06 +0100
commitde4f791e30be4e4239b381c11745ffa4d87ddb8b (patch)
tree885e3a5d6670828b454cf676b4d42f78e28b1f0e /Source/WebKit2/NetworkProcess
parentb022df48697d40cdabdeafb2c29bb14fe489b6fe (diff)
downloadqtwebkit-de4f791e30be4e4239b381c11745ffa4d87ddb8b.tar.gz
Imported WebKit commit e2c32e2f53e02d388e70b9db88b91d8d9d28fc84 (http://svn.webkit.org/repository/webkit/trunk@133952)
Revert back to an older snapshot that should build on ARM
Diffstat (limited to 'Source/WebKit2/NetworkProcess')
-rw-r--r--Source/WebKit2/NetworkProcess/HostRecord.cpp3
-rw-r--r--Source/WebKit2/NetworkProcess/NetworkRequest.cpp127
-rw-r--r--Source/WebKit2/NetworkProcess/NetworkRequest.h63
-rw-r--r--Source/WebKit2/NetworkProcess/NetworkResourceLoadScheduler.cpp61
-rw-r--r--Source/WebKit2/NetworkProcess/NetworkResourceLoadScheduler.h10
5 files changed, 11 insertions, 253 deletions
diff --git a/Source/WebKit2/NetworkProcess/HostRecord.cpp b/Source/WebKit2/NetworkProcess/HostRecord.cpp
index 9d78d43f6..32ba59638 100644
--- a/Source/WebKit2/NetworkProcess/HostRecord.cpp
+++ b/Source/WebKit2/NetworkProcess/HostRecord.cpp
@@ -65,9 +65,6 @@ void HostRecord::addLoadInProgress(ResourceLoadIdentifier identifier)
void HostRecord::remove(ResourceLoadIdentifier identifier)
{
- // FIXME (NetworkProcess): Due to IPC race conditions, it's possible this HostRecord will be asked to remove the same identifer twice.
- // It would be nice to know the identifier has already been removed and treat it as a no-op.
-
if (m_requestsLoading.contains(identifier)) {
m_requestsLoading.remove(identifier);
return;
diff --git a/Source/WebKit2/NetworkProcess/NetworkRequest.cpp b/Source/WebKit2/NetworkProcess/NetworkRequest.cpp
index db82d9382..79e74cf19 100644
--- a/Source/WebKit2/NetworkProcess/NetworkRequest.cpp
+++ b/Source/WebKit2/NetworkProcess/NetworkRequest.cpp
@@ -28,18 +28,7 @@
#if ENABLE(NETWORK_PROCESS)
-#include "Logging.h"
#include "NetworkConnectionToWebProcess.h"
-#include "NetworkProcess.h"
-#include "NetworkProcessConnectionMessages.h"
-#include "RemoteNetworkingContext.h"
-#include "SharedMemory.h"
-#include "WebCoreArgumentCoders.h"
-#include <WebCore/ResourceBuffer.h>
-#include <WebCore/ResourceHandle.h>
-#include <wtf/MainThread.h>
-
-using namespace WebCore;
namespace WebKit {
@@ -48,85 +37,15 @@ NetworkRequest::NetworkRequest(const WebCore::ResourceRequest& request, Resource
, m_identifier(identifier)
, m_connection(connection)
{
- ASSERT(isMainThread());
connection->registerObserver(this);
}
NetworkRequest::~NetworkRequest()
{
- ASSERT(isMainThread());
-
if (m_connection)
m_connection->unregisterObserver(this);
}
-void NetworkRequest::start()
-{
- ASSERT(isMainThread());
-
- // Explicit ref() balanced by a deref() in NetworkRequest::stop()
- ref();
-
- // FIXME (NetworkProcess): Create RemoteNetworkingContext with actual settings.
- m_networkingContext = RemoteNetworkingContext::create(false, false);
-
- // FIXME (NetworkProcess): Pass an actual value for shouldContentSniff (XMLHttpRequest needs that).
- m_handle = ResourceHandle::create(m_networkingContext.get(), m_request, this, false, false);
-}
-
-static bool stopRequestsCalled = false;
-
-static Mutex& requestsToStopMutex()
-{
- DEFINE_STATIC_LOCAL(Mutex, mutex, ());
- return mutex;
-}
-
-static HashSet<NetworkRequest*>& requestsToStop()
-{
- DEFINE_STATIC_LOCAL(HashSet<NetworkRequest*>, requests, ());
- return requests;
-}
-
-void NetworkRequest::scheduleStopOnMainThread()
-{
- MutexLocker locker(requestsToStopMutex());
-
- requestsToStop().add(this);
- if (!stopRequestsCalled) {
- stopRequestsCalled = true;
- callOnMainThread(NetworkRequest::performStops, 0);
- }
-}
-
-void NetworkRequest::performStops(void*)
-{
- ASSERT(stopRequestsCalled);
-
- Vector<NetworkRequest*> requests;
- {
- MutexLocker locker(requestsToStopMutex());
- copyToVector(requestsToStop(), requests);
- requestsToStop().clear();
- stopRequestsCalled = false;
- }
-
- for (size_t i = 0; i < requests.size(); ++i)
- requests[i]->stop();
-}
-
-void NetworkRequest::stop()
-{
- ASSERT(isMainThread());
-
- // Remove this load identifier soon so we can start more network requests.
- NetworkProcess::shared().networkResourceLoadScheduler().scheduleRemoveLoadIdentifier(m_identifier);
-
- // Explicit deref() balanced by a ref() in NetworkRequest::stop()
- // This might cause the NetworkRequest to be destroyed and therefore we do it last.
- deref();
-}
-
void NetworkRequest::connectionToWebProcessDidClose(NetworkConnectionToWebProcess* connection)
{
ASSERT_ARG(connection, connection == m_connection.get());
@@ -134,52 +53,6 @@ void NetworkRequest::connectionToWebProcessDidClose(NetworkConnectionToWebProces
m_connection = 0;
}
-void NetworkRequest::didReceiveResponse(ResourceHandle*, const ResourceResponse& response)
-{
- // FIXME (NetworkProcess): Cache the response.
- connectionToWebProcess()->connection()->send(Messages::NetworkProcessConnection::DidReceiveResponse(m_identifier, response), 0);
-}
-
-void NetworkRequest::didReceiveData(ResourceHandle*, const char* data, int length, int /*encodedDataLength*/)
-{
- // FIXME (NetworkProcess): We have to progressively notify the WebProcess as data is received.
- if (!m_buffer)
- m_buffer = ResourceBuffer::create();
- m_buffer->append(data, length);
-}
-
-void NetworkRequest::didFinishLoading(ResourceHandle*, double finishTime)
-{
- // FIXME (NetworkProcess): Currently this callback can come in on a non-main thread.
- // This is okay for now since resource buffers are per-NetworkRequest.
- // Once we manage memory in an actual memory cache that also includes SharedMemory blocks this will get complicated.
- // Maybe we should marshall it to the main thread?
-
- ShareableResource::Handle handle;
-
- if (m_buffer && m_buffer->size()) {
- // FIXME (NetworkProcess): We shouldn't be creating this SharedMemory on demand here.
- // SharedMemory blocks need to be managed as part of the cache backing store.
- RefPtr<SharedMemory> sharedBuffer = SharedMemory::create(m_buffer->size());
- memcpy(sharedBuffer->data(), m_buffer->data(), m_buffer->size());
-
- RefPtr<ShareableResource> shareableResource = ShareableResource::create(sharedBuffer.release(), 0, m_buffer->size());
-
- // FIXME (NetworkProcess): Handle errors from createHandle();
- if (!shareableResource->createHandle(handle))
- LOG_ERROR("Failed to create handle to shareable resource memory\n");
- }
-
- connectionToWebProcess()->connection()->send(Messages::NetworkProcessConnection::DidReceiveResource(m_identifier, handle, finishTime), 0);
- scheduleStopOnMainThread();
-}
-
-void NetworkRequest::didFail(WebCore::ResourceHandle*, const WebCore::ResourceError& error)
-{
- connectionToWebProcess()->connection()->send(Messages::NetworkProcessConnection::DidFailResourceLoad(m_identifier, error), 0);
- scheduleStopOnMainThread();
-}
-
} // namespace WebKit
#endif // ENABLE(NETWORK_PROCESS)
diff --git a/Source/WebKit2/NetworkProcess/NetworkRequest.h b/Source/WebKit2/NetworkProcess/NetworkRequest.h
index c8c3e2e92..683e832c2 100644
--- a/Source/WebKit2/NetworkProcess/NetworkRequest.h
+++ b/Source/WebKit2/NetworkProcess/NetworkRequest.h
@@ -29,20 +29,13 @@
#if ENABLE(NETWORK_PROCESS)
#include "NetworkConnectionToWebProcess.h"
-#include <WebCore/ResourceHandleClient.h>
#include <WebCore/ResourceRequest.h>
-namespace WebCore {
-class ResourceBuffer;
-class ResourceHandle;
-}
-
namespace WebKit {
-class RemoteNetworkingContext;
typedef uint64_t ResourceLoadIdentifier;
-class NetworkRequest : public RefCounted<NetworkRequest>, public NetworkConnectionToWebProcessObserver, public WebCore::ResourceHandleClient {
+class NetworkRequest : public RefCounted<NetworkRequest>, public NetworkConnectionToWebProcessObserver {
public:
static RefPtr<NetworkRequest> create(const WebCore::ResourceRequest& request, ResourceLoadIdentifier identifier, NetworkConnectionToWebProcess* connection)
{
@@ -51,71 +44,19 @@ public:
~NetworkRequest();
- void start();
-
- virtual void connectionToWebProcessDidClose(NetworkConnectionToWebProcess*) OVERRIDE;
+ void connectionToWebProcessDidClose(NetworkConnectionToWebProcess*);
ResourceLoadIdentifier identifier() { return m_identifier; }
NetworkConnectionToWebProcess* connectionToWebProcess() { return m_connection.get(); }
- // ResourceHandleClient methods
- virtual void willSendRequest(WebCore::ResourceHandle*, WebCore::ResourceRequest&, const WebCore::ResourceResponse& /*redirectResponse*/) OVERRIDE { }
- virtual void didSendData(WebCore::ResourceHandle*, unsigned long long /*bytesSent*/, unsigned long long /*totalBytesToBeSent*/) OVERRIDE { }
- virtual void didReceiveResponse(WebCore::ResourceHandle*, const WebCore::ResourceResponse&) OVERRIDE;
- virtual void didReceiveData(WebCore::ResourceHandle*, const char*, int, int /*encodedDataLength*/) OVERRIDE;
- virtual void didReceiveCachedMetadata(WebCore::ResourceHandle*, const char*, int) OVERRIDE { }
- virtual void didFinishLoading(WebCore::ResourceHandle*, double /*finishTime*/) OVERRIDE;
- virtual void didFail(WebCore::ResourceHandle*, const WebCore::ResourceError&) OVERRIDE;
- virtual void wasBlocked(WebCore::ResourceHandle*) OVERRIDE { }
- virtual void cannotShowURL(WebCore::ResourceHandle*) OVERRIDE { }
-#if HAVE(NETWORK_CFDATA_ARRAY_CALLBACK)
- virtual bool supportsDataArray() OVERRIDE { return false; }
- virtual void didReceiveDataArray(WebCore::ResourceHandle*, CFArrayRef) OVERRIDE { }
-#endif
- virtual void willCacheResponse(WebCore::ResourceHandle*, WebCore::CacheStoragePolicy&) OVERRIDE { }
- virtual bool shouldUseCredentialStorage(WebCore::ResourceHandle*) OVERRIDE { return false; }
- virtual void didReceiveAuthenticationChallenge(WebCore::ResourceHandle*, const WebCore::AuthenticationChallenge&) OVERRIDE { }
- virtual void didCancelAuthenticationChallenge(WebCore::ResourceHandle*, const WebCore::AuthenticationChallenge&) OVERRIDE { }
-#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
- virtual bool canAuthenticateAgainstProtectionSpace(WebCore::ResourceHandle*, const WebCore::ProtectionSpace&) OVERRIDE { return false; }
-#endif
- virtual void receivedCancellation(WebCore::ResourceHandle*, const WebCore::AuthenticationChallenge&) OVERRIDE { }
-#if PLATFORM(MAC)
-#if USE(CFNETWORK)
- virtual CFCachedURLResponseRef willCacheResponse(WebCore::ResourceHandle*, CFCachedURLResponseRef response) OVERRIDE { return response; }
-#else
- virtual NSCachedURLResponse* willCacheResponse(WebCore::ResourceHandle*, NSCachedURLResponse* response) OVERRIDE { return response; }
-#endif
- virtual void willStopBufferingData(WebCore::ResourceHandle*, const char*, int) OVERRIDE { }
-#endif // PLATFORM(MAC)
-
-#if PLATFORM(WIN) && USE(CFNETWORK)
- virtual bool shouldCacheResponse(WebCore::ResourceHandle*, CFCachedURLResponseRef) OVERRIDE { return true; }
-#endif
-
-#if ENABLE(BLOB)
- virtual WebCore::AsyncFileStream* createAsyncFileStream(WebCore::FileStreamClient*) OVERRIDE { return 0; }
-#endif
-
private:
NetworkRequest(const WebCore::ResourceRequest&, ResourceLoadIdentifier, NetworkConnectionToWebProcess*);
- void scheduleStopOnMainThread();
- static void performStops(void*);
-
- void stop();
-
WebCore::ResourceRequest m_request;
ResourceLoadIdentifier m_identifier;
- RefPtr<RemoteNetworkingContext> m_networkingContext;
- RefPtr<WebCore::ResourceHandle> m_handle;
-
RefPtr<NetworkConnectionToWebProcess> m_connection;
-
- // FIXME (NetworkProcess): Response data lifetime should be managed outside NetworkRequest.
- RefPtr<WebCore::ResourceBuffer> m_buffer;
};
} // namespace WebKit
diff --git a/Source/WebKit2/NetworkProcess/NetworkResourceLoadScheduler.cpp b/Source/WebKit2/NetworkProcess/NetworkResourceLoadScheduler.cpp
index bcc5e4435..ccc3d76b9 100644
--- a/Source/WebKit2/NetworkProcess/NetworkResourceLoadScheduler.cpp
+++ b/Source/WebKit2/NetworkProcess/NetworkResourceLoadScheduler.cpp
@@ -6,7 +6,6 @@
#include "NetworkConnectionToWebProcess.h"
#include "NetworkProcessconnectionMessages.h"
#include "NetworkRequest.h"
-#include <wtf/MainThread.h>
#include <wtf/text/CString.h>
#if ENABLE(NETWORK_PROCESS)
@@ -42,7 +41,7 @@ ResourceLoadIdentifier NetworkResourceLoadScheduler::scheduleNetworkRequest(cons
{
ResourceLoadIdentifier identifier = ++s_currentResourceLoadIdentifier;
- LOG(NetworkScheduling, "(NetworkProcess) NetworkResourceLoadScheduler::scheduleNetworkRequest resource %llu '%s'", identifier, request.url().string().utf8().data());
+ LOG(Network, "(NetworkProcess) NetworkResourceLoadScheduler::scheduleNetworkRequest resource %llu '%s'", identifier, request.url().string().utf8().data());
HostRecord* host = hostForURL(request.url(), CreateIfNotFound);
bool hadRequests = host->hasRequests();
@@ -64,7 +63,7 @@ ResourceLoadIdentifier NetworkResourceLoadScheduler::addLoadInProgress(const Web
{
ResourceLoadIdentifier identifier = ++s_currentResourceLoadIdentifier;
- LOG(NetworkScheduling, "(NetworkProcess) NetworkResourceLoadScheduler::addLoadInProgress resource %llu with url '%s'", identifier, url.string().utf8().data());
+ LOG(Network, "(NetworkProcess) NetworkResourceLoadScheduler::addLoadInProgress resource %llu with url '%s'", identifier, url.string().utf8().data());
HostRecord* host = hostForURL(url, CreateIfNotFound);
host->addLoadInProgress(identifier);
@@ -91,16 +90,12 @@ HostRecord* NetworkResourceLoadScheduler::hostForURL(const WebCore::KURL& url, C
void NetworkResourceLoadScheduler::removeLoadIdentifier(ResourceLoadIdentifier identifier)
{
- ASSERT(isMainThread());
ASSERT(identifier);
- LOG(NetworkScheduling, "(NetworkProcess) NetworkResourceLoadScheduler::removeLoadIdentifier removing load identifier %llu", identifier);
+ LOG(Network, "(NetworkProcess) NetworkResourceLoadScheduler::removeLoadIdentifier removing load identifier %llu", identifier);
HostRecord* host = m_identifiers.take(identifier);
-
- // Due to a race condition the WebProcess might have messaged the NetworkProcess to remove this identifier
- // after the NetworkProcess has already removed it internally.
- // In this situation we might not have a HostRecord to clean up.
+ ASSERT(host);
if (host)
host->remove(identifier);
@@ -109,8 +104,7 @@ void NetworkResourceLoadScheduler::removeLoadIdentifier(ResourceLoadIdentifier i
void NetworkResourceLoadScheduler::crossOriginRedirectReceived(ResourceLoadIdentifier identifier, const WebCore::KURL& redirectURL)
{
- ASSERT(isMainThread());
- LOG(NetworkScheduling, "(NetworkProcess) NetworkResourceLoadScheduler::crossOriginRedirectReceived resource %llu redirected to '%s'", identifier, redirectURL.string().utf8().data());
+ LOG(Network, "(NetworkProcess) NetworkResourceLoadScheduler::crossOriginRedirectReceived resource %llu redirected to '%s'", identifier, redirectURL.string().utf8().data());
HostRecord* oldHost = m_identifiers.get(identifier);
HostRecord* newHost = hostForURL(redirectURL, CreateIfNotFound);
@@ -130,7 +124,7 @@ void NetworkResourceLoadScheduler::servePendingRequests(ResourceLoadPriority min
if (m_suspendPendingRequestsCount)
return;
- LOG(NetworkScheduling, "(NetworkProcess) NetworkResourceLoadScheduler::servePendingRequests Serving requests for up to %i hosts", m_hosts.size());
+ LOG(Network, "(NetworkProcess) NetworkResourceLoadScheduler::servePendingRequests Serving requests for up to %i hosts", m_hosts.size());
m_requestTimer.stop();
@@ -152,7 +146,7 @@ void NetworkResourceLoadScheduler::servePendingRequests(ResourceLoadPriority min
void NetworkResourceLoadScheduler::servePendingRequestsForHost(HostRecord* host, ResourceLoadPriority minimumPriority)
{
- LOG(NetworkScheduling, "NetworkResourceLoadScheduler::servePendingRequests Host name='%s'", host->name().utf8().data());
+ LOG(Network, "NetworkResourceLoadScheduler::servePendingRequests Host name='%s'", host->name().utf8().data());
for (int priority = ResourceLoadPriorityHighest; priority >= minimumPriority; --priority) {
HostRecord::RequestQueue& requestsPending = host->requestsPending(ResourceLoadPriority(priority));
@@ -184,8 +178,8 @@ void NetworkResourceLoadScheduler::servePendingRequestsForHost(HostRecord* host,
requestsPending.removeFirst();
host->addLoadInProgress(request->identifier());
-
- request->start();
+
+ request->connectionToWebProcess()->connection()->send(Messages::NetworkProcessConnection::StartResourceLoad(request->identifier()), 0);
}
}
}
@@ -206,43 +200,6 @@ void NetworkResourceLoadScheduler::resumePendingRequests()
scheduleServePendingRequests();
}
-static bool removeScheduledLoadIdentifiersCalled = false;
-
-void NetworkResourceLoadScheduler::removeScheduledLoadIdentifiers(void* context)
-{
- ASSERT(isMainThread());
- ASSERT(removeScheduledLoadIdentifiersCalled);
-
- NetworkResourceLoadScheduler* scheduler = static_cast<NetworkResourceLoadScheduler*>(context);
- scheduler->removeScheduledLoadIdentifiers();
-}
-
-void NetworkResourceLoadScheduler::removeScheduledLoadIdentifiers()
-{
- Vector<ResourceLoadIdentifier> identifiers;
- {
- MutexLocker locker(m_identifiersToRemoveMutex);
- copyToVector(m_identifiersToRemove, identifiers);
- m_identifiersToRemove.clear();
- removeScheduledLoadIdentifiersCalled = false;
- }
-
- for (size_t i = 0; i < identifiers.size(); ++i)
- removeLoadIdentifier(identifiers[i]);
-}
-
-void NetworkResourceLoadScheduler::scheduleRemoveLoadIdentifier(ResourceLoadIdentifier identifier)
-{
- MutexLocker locker(m_identifiersToRemoveMutex);
-
- m_identifiersToRemove.add(identifier);
-
- if (!removeScheduledLoadIdentifiersCalled) {
- removeScheduledLoadIdentifiersCalled = true;
- callOnMainThread(NetworkResourceLoadScheduler::removeScheduledLoadIdentifiers, this);
- }
-}
-
} // namespace WebKit
#endif // ENABLE(NETWORK_PROCESS)
diff --git a/Source/WebKit2/NetworkProcess/NetworkResourceLoadScheduler.h b/Source/WebKit2/NetworkProcess/NetworkResourceLoadScheduler.h
index 0f98ffd31..a16a38847 100644
--- a/Source/WebKit2/NetworkProcess/NetworkResourceLoadScheduler.h
+++ b/Source/WebKit2/NetworkProcess/NetworkResourceLoadScheduler.h
@@ -28,7 +28,6 @@
#include <WebCore/ResourceRequest.h>
#include <WebCore/Timer.h>
-#include <wtf/HashSet.h>
#if ENABLE(NETWORK_PROCESS)
@@ -53,9 +52,6 @@ public:
// Called by the WebProcess when a ResourceLoader is being cleaned up.
void removeLoadIdentifier(ResourceLoadIdentifier);
- // Called within the NetworkProcess on a background thread when a resource load has finished.
- void scheduleRemoveLoadIdentifier(ResourceLoadIdentifier);
-
void crossOriginRedirectReceived(ResourceLoadIdentifier, const WebCore::KURL& redirectURL);
void servePendingRequests(WebCore::ResourceLoadPriority = WebCore::ResourceLoadPriorityVeryLow);
void suspendPendingRequests();
@@ -76,9 +72,6 @@ private:
unsigned platformInitializeMaximumHTTPConnectionCountPerHost();
- static void removeScheduledLoadIdentifiers(void* context);
- void removeScheduledLoadIdentifiers();
-
typedef HashMap<String, HostRecord*, StringHash> HostMap;
HostMap m_hosts;
@@ -91,9 +84,6 @@ private:
bool m_isSerialLoadingEnabled;
WebCore::Timer<NetworkResourceLoadScheduler> m_requestTimer;
-
- Mutex m_identifiersToRemoveMutex;
- HashSet<ResourceLoadIdentifier> m_identifiersToRemove;
};
} // namespace WebKit