2
* Copyright (C) 2012 Apple Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
13
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23
* THE POSSIBILITY OF SUCH DAMAGE.
26
#ifndef NetworkResourceLoadScheduler_h
27
#define NetworkResourceLoadScheduler_h
29
#include "NetworkResourceLoader.h"
30
#include <WebCore/ResourceLoaderOptions.h>
31
#include <WebCore/ResourceRequest.h>
32
#include <WebCore/Timer.h>
33
#include <wtf/HashSet.h>
35
#if ENABLE(NETWORK_PROCESS)
40
class NetworkResourceLoadParameters;
41
class NetworkConnectionToWebProcess;
42
typedef uint64_t ResourceLoadIdentifier;
44
class NetworkResourceLoadScheduler {
45
WTF_MAKE_NONCOPYABLE(NetworkResourceLoadScheduler); WTF_MAKE_FAST_ALLOCATED;
48
NetworkResourceLoadScheduler();
50
// Adds the request to the queue for its host and create a unique identifier for it.
51
ResourceLoadIdentifier scheduleResourceLoad(const NetworkResourceLoadParameters&, NetworkConnectionToWebProcess*);
53
// Creates a unique identifier for an already-in-progress load.
54
ResourceLoadIdentifier addLoadInProgress(const WebCore::KURL&);
56
// Called by the WebProcess when a ResourceLoader is being cleaned up.
57
void removeLoadIdentifier(ResourceLoadIdentifier);
59
// Called within the NetworkProcess on a background thread when a resource load has finished.
60
void scheduleRemoveLoadIdentifier(ResourceLoadIdentifier);
62
void receivedRedirect(ResourceLoadIdentifier, const WebCore::KURL& redirectURL);
63
void servePendingRequests(WebCore::ResourceLoadPriority = WebCore::ResourceLoadPriorityVeryLow);
64
void suspendPendingRequests();
65
void resumePendingRequests();
67
NetworkResourceLoader* networkResourceLoaderForIdentifier(ResourceLoadIdentifier);
70
enum CreateHostPolicy {
75
HostRecord* hostForURL(const WebCore::KURL&, CreateHostPolicy = FindOnly);
77
void scheduleServePendingRequests();
78
void requestTimerFired(WebCore::Timer<NetworkResourceLoadScheduler>*);
80
void servePendingRequestsForHost(HostRecord*, WebCore::ResourceLoadPriority);
82
unsigned platformInitializeMaximumHTTPConnectionCountPerHost();
84
static void removeScheduledLoadIdentifiers(void* context);
85
void removeScheduledLoadIdentifiers();
87
HashMap<ResourceLoadIdentifier, RefPtr<NetworkResourceLoader> > m_resourceLoaders;
89
typedef HashMap<String, HostRecord*, StringHash> HostMap;
92
typedef HashMap<ResourceLoadIdentifier, HostRecord*> IdentifierHostMap;
93
IdentifierHostMap m_identifiers;
95
HostRecord* m_nonHTTPProtocolHost;
97
unsigned m_suspendPendingRequestsCount;
98
bool m_isSerialLoadingEnabled;
100
WebCore::Timer<NetworkResourceLoadScheduler> m_requestTimer;
102
Mutex m_identifiersToRemoveMutex;
103
HashSet<ResourceLoadIdentifier> m_identifiersToRemove;
106
} // namespace WebKit
108
#endif // ENABLE(NETWORK_PROCESS)
110
#endif // NetworkResourceLoadScheduler_h