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 37namespace WebCore { 38 39class CachedResource; 40class Frame; 41class URL; 42class NetscapePlugInStreamLoader; 43class NetscapePlugInStreamLoaderClient; 44class ResourceLoader; 45class ResourceRequest; 46class SubresourceLoader; 47 48class ResourceLoadScheduler { 49 WTF_MAKE_NONCOPYABLE(ResourceLoadScheduler); WTF_MAKE_FAST_ALLOCATED; 50public: 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 remove(ResourceLoader*); 56 virtual void setDefersLoading(ResourceLoader*, bool); 57 virtual void crossOriginRedirectReceived(ResourceLoader*, const URL& 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 class Suspender { 67 public: 68 explicit Suspender(ResourceLoadScheduler& scheduler) : m_scheduler(scheduler) { m_scheduler.suspendPendingRequests(); } 69 ~Suspender() { m_scheduler.resumePendingRequests(); } 70 private: 71 ResourceLoadScheduler& m_scheduler; 72 }; 73 74protected: 75 ResourceLoadScheduler(); 76 virtual ~ResourceLoadScheduler(); 77 78 void notifyDidScheduleResourceRequest(ResourceLoader*); 79 80#if USE(QUICK_LOOK) 81 bool maybeLoadQuickLookResource(ResourceLoader&); 82#endif 83 84private: 85 void scheduleLoad(ResourceLoader*, ResourceLoadPriority); 86 void scheduleServePendingRequests(); 87 void requestTimerFired(Timer<ResourceLoadScheduler>&); 88 89 bool isSuspendingPendingRequests() const { return !!m_suspendPendingRequestsCount; } 90 91 class HostInformation { 92 WTF_MAKE_NONCOPYABLE(HostInformation); WTF_MAKE_FAST_ALLOCATED; 93 public: 94 HostInformation(const String&, unsigned); 95 ~HostInformation(); 96 97 const String& name() const { return m_name; } 98 void schedule(ResourceLoader*, ResourceLoadPriority = ResourceLoadPriorityVeryLow); 99 void addLoadInProgress(ResourceLoader*); 100 void remove(ResourceLoader*); 101 bool hasRequests() const; 102 bool limitRequests(ResourceLoadPriority) const; 103 104 typedef Deque<RefPtr<ResourceLoader>> RequestQueue; 105 RequestQueue& requestsPending(ResourceLoadPriority priority) { return m_requestsPending[priority]; } 106 107 private: 108 RequestQueue m_requestsPending[ResourceLoadPriorityHighest + 1]; 109 typedef HashSet<RefPtr<ResourceLoader>> RequestMap; 110 RequestMap m_requestsLoading; 111 const String m_name; 112 const int m_maxRequestsInFlight; 113 }; 114 115 enum CreateHostPolicy { 116 CreateIfNotFound, 117 FindOnly 118 }; 119 120 HostInformation* hostForURL(const URL&, CreateHostPolicy = FindOnly); 121 void servePendingRequests(HostInformation*, ResourceLoadPriority); 122 123 typedef HashMap<String, HostInformation*, StringHash> HostMap; 124 HostMap m_hosts; 125 HostInformation* m_nonHTTPProtocolHost; 126 127 Timer<ResourceLoadScheduler> m_requestTimer; 128 129 unsigned m_suspendPendingRequestsCount; 130 bool m_isSerialLoadingEnabled; 131}; 132 133ResourceLoadScheduler* resourceLoadScheduler(); 134 135} 136 137#endif 138