~ubuntu-branches/ubuntu/raring/qtwebkit-source/raring-proposed

« back to all changes in this revision

Viewing changes to Source/WebCore/loader/ResourceLoadScheduler.h

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-02-18 14:24:18 UTC
  • Revision ID: package-import@ubuntu.com-20130218142418-eon0jmjg3nj438uy
Tags: upstream-2.3
ImportĀ upstreamĀ versionĀ 2.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
    Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
 
3
    Copyright (C) 2001 Dirk Mueller <mueller@kde.org>
 
4
    Copyright (C) 2004, 2006, 2007, 2008 Apple Inc. All rights reserved.
 
5
    Copyright (C) 2010 Google Inc. All rights reserved.
 
6
 
 
7
    This library is free software; you can redistribute it and/or
 
8
    modify it under the terms of the GNU Library General Public
 
9
    License as published by the Free Software Foundation; either
 
10
    version 2 of the License, or (at your option) any later version.
 
11
 
 
12
    This library is distributed in the hope that it will be useful,
 
13
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
15
    Library General Public License for more details.
 
16
 
 
17
    You should have received a copy of the GNU Library General Public License
 
18
    along with this library; see the file COPYING.LIB.  If not, write to
 
19
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 
20
    Boston, MA 02110-1301, USA.
 
21
 */
 
22
 
 
23
#ifndef ResourceLoadScheduler_h
 
24
#define ResourceLoadScheduler_h
 
25
 
 
26
#include "FrameLoaderTypes.h"
 
27
#include "ResourceLoaderOptions.h"
 
28
#include "ResourceLoadPriority.h"
 
29
#include "Timer.h"
 
30
#include <wtf/Deque.h>
 
31
#include <wtf/HashMap.h>
 
32
#include <wtf/HashSet.h>
 
33
#include <wtf/Noncopyable.h>
 
34
#include <wtf/text/StringHash.h>
 
35
#include <wtf/text/WTFString.h>
 
36
 
 
37
namespace WebCore {
 
38
 
 
39
class CachedResource;
 
40
class Frame;
 
41
class KURL;
 
42
class NetscapePlugInStreamLoader;
 
43
class NetscapePlugInStreamLoaderClient;
 
44
class ResourceLoader;
 
45
class ResourceRequest;
 
46
class SubresourceLoader;
 
47
 
 
48
class ResourceLoadScheduler {
 
49
    WTF_MAKE_NONCOPYABLE(ResourceLoadScheduler); WTF_MAKE_FAST_ALLOCATED;
 
50
public:
 
51
    friend ResourceLoadScheduler* resourceLoadScheduler();
 
52
 
 
53
    virtual PassRefPtr<SubresourceLoader> scheduleSubresourceLoad(Frame*, CachedResource*, const ResourceRequest&, ResourceLoadPriority, const ResourceLoaderOptions&);
 
54
    virtual PassRefPtr<NetscapePlugInStreamLoader> schedulePluginStreamLoad(Frame*, NetscapePlugInStreamLoaderClient*, const ResourceRequest&);
 
55
    virtual void addMainResourceLoad(ResourceLoader*);
 
56
    virtual void remove(ResourceLoader*);
 
57
    virtual void crossOriginRedirectReceived(ResourceLoader*, const KURL& redirectURL);
 
58
    
 
59
    virtual void servePendingRequests(ResourceLoadPriority minimumPriority = ResourceLoadPriorityVeryLow);
 
60
    virtual void suspendPendingRequests();
 
61
    virtual void resumePendingRequests();
 
62
    
 
63
    bool isSerialLoadingEnabled() const { return m_isSerialLoadingEnabled; }
 
64
    virtual void setSerialLoadingEnabled(bool b) { m_isSerialLoadingEnabled = b; }
 
65
 
 
66
protected:
 
67
    ResourceLoadScheduler();
 
68
    virtual ~ResourceLoadScheduler();
 
69
 
 
70
    void startResourceLoader(ResourceLoader*);
 
71
    void notifyDidScheduleResourceRequest(ResourceLoader*);
 
72
 
 
73
private:
 
74
    void scheduleLoad(ResourceLoader*, ResourceLoadPriority);
 
75
    void scheduleServePendingRequests();
 
76
    void requestTimerFired(Timer<ResourceLoadScheduler>*);
 
77
 
 
78
    bool isSuspendingPendingRequests() const { return !!m_suspendPendingRequestsCount; }
 
79
 
 
80
    class HostInformation {
 
81
        WTF_MAKE_NONCOPYABLE(HostInformation); WTF_MAKE_FAST_ALLOCATED;
 
82
    public:
 
83
        HostInformation(const String&, unsigned);
 
84
        ~HostInformation();
 
85
        
 
86
        const String& name() const { return m_name; }
 
87
        void schedule(ResourceLoader*, ResourceLoadPriority = ResourceLoadPriorityVeryLow);
 
88
        void addLoadInProgress(ResourceLoader*);
 
89
        void remove(ResourceLoader*);
 
90
        bool hasRequests() const;
 
91
        bool limitRequests(ResourceLoadPriority) const;
 
92
 
 
93
        typedef Deque<RefPtr<ResourceLoader> > RequestQueue;
 
94
        RequestQueue& requestsPending(ResourceLoadPriority priority) { return m_requestsPending[priority]; }
 
95
 
 
96
    private:                    
 
97
        RequestQueue m_requestsPending[ResourceLoadPriorityHighest + 1];
 
98
        typedef HashSet<RefPtr<ResourceLoader> > RequestMap;
 
99
        RequestMap m_requestsLoading;
 
100
        const String m_name;
 
101
        const int m_maxRequestsInFlight;
 
102
    };
 
103
 
 
104
    enum CreateHostPolicy {
 
105
        CreateIfNotFound,
 
106
        FindOnly
 
107
    };
 
108
    
 
109
    HostInformation* hostForURL(const KURL&, CreateHostPolicy = FindOnly);
 
110
    void servePendingRequests(HostInformation*, ResourceLoadPriority);
 
111
 
 
112
    typedef HashMap<String, HostInformation*, StringHash> HostMap;
 
113
    HostMap m_hosts;
 
114
    HostInformation* m_nonHTTPProtocolHost;
 
115
        
 
116
    Timer<ResourceLoadScheduler> m_requestTimer;
 
117
 
 
118
    unsigned m_suspendPendingRequestsCount;
 
119
    bool m_isSerialLoadingEnabled;
 
120
};
 
121
 
 
122
ResourceLoadScheduler* resourceLoadScheduler();
 
123
 
 
124
}
 
125
 
 
126
#endif