void Loader::servePendingRequests(Priority minimumPriority) { if (m_isSuspendingPendingRequests) return; m_requestTimer.stop(); m_nonHTTPProtocolHost->servePendingRequests(minimumPriority); Vector<Host*> hostsToServe; m_hosts.checkConsistency(); HostMap::iterator i = m_hosts.begin(); HostMap::iterator end = m_hosts.end(); for (; i != end; ++i) hostsToServe.append(i->second.get()); for (unsigned n = 0; n < hostsToServe.size(); ++n) { Host* host = hostsToServe[n]; if (host->hasRequests()) host->servePendingRequests(minimumPriority); else if (!host->processingResource()) { AtomicString name = host->name(); m_hosts.remove(name.impl()); } } }
void Loader::load(DocLoader* docLoader, CachedResource* resource, bool incremental, bool skipCanLoadCheck, bool sendResourceLoadCallbacks) { ASSERT(docLoader); Request* request = new Request(docLoader, resource, incremental, skipCanLoadCheck, sendResourceLoadCallbacks); Host* host; KURL url(resource->url()); bool isHTTP = url.protocolIs("http") || url.protocolIs("https"); if (isHTTP) { AtomicString hostName = url.host(); host = m_hosts.get(hostName.impl()); if (!host) { host = new Host(hostName, maxRequestsInFlightPerHost); m_hosts.add(hostName.impl(), host); } } else host = &m_nonHTTPProtocolHost; bool hadRequests = host->hasRequests(); Priority priority = determinePriority(resource); host->addRequest(request, priority); docLoader->incrementRequestCount(); if (priority > Low || !isHTTP || !hadRequests) { // Try to request important resources immediately host->servePendingRequests(priority); } else { // Handle asynchronously so early low priority requests don't get scheduled before later high priority ones scheduleServePendingRequests(); } }
void Loader::servePendingRequests(Priority minimumPriority) { m_requestTimer.stop(); m_nonHTTPProtocolHost.servePendingRequests(minimumPriority); Vector<Host*> hostsToServe; copyValuesToVector(m_hosts, hostsToServe); for (unsigned n = 0; n < hostsToServe.size(); ++n) { Host* host = hostsToServe[n]; if (host->hasRequests()) host->servePendingRequests(minimumPriority); else if (!host->processingResource()){ AtomicString name = host->name(); delete host; m_hosts.remove(name.impl()); } } }
void Loader::cancelRequests(DocLoader* docLoader) { if (m_nonHTTPProtocolHost.hasRequests()) m_nonHTTPProtocolHost.cancelRequests(docLoader); Vector<Host*> hostsToCancel; copyValuesToVector(m_hosts, hostsToCancel); for (unsigned n = 0; n < hostsToCancel.size(); ++n) { Host* host = hostsToCancel[n]; if (host->hasRequests()) host->cancelRequests(docLoader); } scheduleServePendingRequests(); if (docLoader->loadInProgress()) ASSERT(docLoader->requestCount() == 1); else ASSERT(docLoader->requestCount() == 0); }
void Loader::cancelRequests(DocLoader* docLoader) { docLoader->clearPendingPreloads(); if (m_nonHTTPProtocolHost->hasRequests()) m_nonHTTPProtocolHost->cancelRequests(docLoader); Vector<Host*> hostsToCancel; m_hosts.checkConsistency(); HostMap::iterator i = m_hosts.begin(); HostMap::iterator end = m_hosts.end(); for (; i != end; ++i) hostsToCancel.append(i->second.get()); for (unsigned n = 0; n < hostsToCancel.size(); ++n) { Host* host = hostsToCancel[n]; if (host->hasRequests()) host->cancelRequests(docLoader); } scheduleServePendingRequests(); ASSERT(docLoader->requestCount() == (docLoader->loadInProgress() ? 1 : 0)); }