diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-09 12:15:52 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-09 12:16:06 +0100 |
commit | de4f791e30be4e4239b381c11745ffa4d87ddb8b (patch) | |
tree | 885e3a5d6670828b454cf676b4d42f78e28b1f0e /Source/WebKit2/NetworkProcess | |
parent | b022df48697d40cdabdeafb2c29bb14fe489b6fe (diff) | |
download | qtwebkit-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')
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 |