void Loader::resumePendingRequests() { ASSERT(m_isSuspendingPendingRequests); m_isSuspendingPendingRequests = false; if (!m_hosts.isEmpty() || m_nonHTTPProtocolHost->hasRequests()) scheduleServePendingRequests(); }
void ResourceLoadScheduler::scheduleLoad(ResourceLoader* resourceLoader, ResourceLoadPriority priority) { ASSERT(resourceLoader); ASSERT(priority != ResourceLoadPriorityUnresolved); #if !REQUEST_MANAGEMENT_ENABLED priority = ResourceLoadPriorityHighest; #endif LOG(ResourceLoading, "ResourceLoadScheduler::load resource %p '%s'", resourceLoader, resourceLoader->url().string().latin1().data()); // If there's a web archive resource for this URL, we don't need to schedule the load since it will never touch the network. if (resourceLoader->documentLoader()->archiveResourceForURL(resourceLoader->request().url())) { resourceLoader->start(); return; } HostInformation* host = hostForURL(resourceLoader->url(), CreateIfNotFound); bool hadRequests = host->hasRequests(); host->schedule(resourceLoader, priority); if (priority > ResourceLoadPriorityLow || !resourceLoader->url().protocolIsInHTTPFamily() || (priority == ResourceLoadPriorityLow && !hadRequests)) { // Try to request important resources immediately. servePendingRequests(host, priority); return; } notifyDidScheduleResourceRequest(resourceLoader); // Handle asynchronously so early low priority requests don't // get scheduled before later high priority ones. scheduleServePendingRequests(); }
void Loader::load(DocLoader* docLoader, CachedResource* resource, bool incremental, SecurityCheckPolicy securityCheck, bool sendResourceLoadCallbacks) { ASSERT(docLoader); Request* request = new Request(docLoader, resource, incremental, securityCheck, sendResourceLoadCallbacks); RefPtr<Host> host; KURL url(ParsedURLString, resource->url()); if (url.protocolInHTTPFamily()) { m_hosts.checkConsistency(); AtomicString hostName = url.host(); host = m_hosts.get(hostName.impl()); if (!host) { host = Host::create(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 || !url.protocolInHTTPFamily() || !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::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 ResourceLoadScheduler::scheduleLoad(ResourceLoader* resourceLoader, ResourceLoadPriority priority) { ASSERT(resourceLoader); ASSERT(priority != ResourceLoadPriorityUnresolved); LOG(ResourceLoading, "ResourceLoadScheduler::load resource %p '%s'", resourceLoader, resourceLoader->url().string().latin1().data()); #if PLATFORM(IOS) // If there's a web archive resource for this URL, we don't need to schedule the load since it will never touch the network. if (!isSuspendingPendingRequests() && resourceLoader->documentLoader()->archiveResourceForURL(resourceLoader->iOSOriginalRequest().url())) { resourceLoader->startLoading(); return; } #else if (resourceLoader->documentLoader()->archiveResourceForURL(resourceLoader->request().url())) { resourceLoader->start(); return; } #endif #if PLATFORM(IOS) HostInformation* host = hostForURL(resourceLoader->iOSOriginalRequest().url(), CreateIfNotFound); #else HostInformation* host = hostForURL(resourceLoader->url(), CreateIfNotFound); #endif bool hadRequests = host->hasRequests(); host->schedule(resourceLoader, priority); #if PLATFORM(COCOA) || USE(CFNETWORK) if (!isSuspendingPendingRequests()) { // Serve all requests at once to keep the pipeline full at the network layer. // FIXME: Does this code do anything useful, given that we also set maxRequestsInFlightPerHost to effectively unlimited on these platforms? servePendingRequests(host, ResourceLoadPriorityVeryLow); return; } #endif #if PLATFORM(IOS) if ((priority > ResourceLoadPriorityLow || !resourceLoader->iOSOriginalRequest().url().protocolIsInHTTPFamily() || (priority == ResourceLoadPriorityLow && !hadRequests)) && !isSuspendingPendingRequests()) { // Try to request important resources immediately. servePendingRequests(host, priority); return; } #else if (priority > ResourceLoadPriorityLow || !resourceLoader->url().protocolIsInHTTPFamily() || (priority == ResourceLoadPriorityLow && !hadRequests)) { // Try to request important resources immediately. servePendingRequests(host, priority); return; } #endif notifyDidScheduleResourceRequest(resourceLoader); // Handle asynchronously so early low priority requests don't // get scheduled before later high priority ones. scheduleServePendingRequests(); }
void ResourceLoadScheduler::resumePendingRequests() { ASSERT(m_suspendPendingRequestsCount); --m_suspendPendingRequestsCount; if (m_suspendPendingRequestsCount) return; if (!m_hosts.isEmpty() || m_nonHTTPProtocolHost->hasRequests()) scheduleServePendingRequests(); }
void ResourceLoadScheduler::remove(ResourceLoader* resourceLoader) { ASSERT(resourceLoader); HostInformation* host = hostForURL(resourceLoader->url()); if (host) host->remove(resourceLoader); scheduleServePendingRequests(); }
void NetworkResourceLoadScheduler::removeLoader(NetworkResourceLoader* loader) { ASSERT(RunLoop::isMain()); ASSERT(loader); LOG(NetworkScheduling, "(NetworkProcess) NetworkResourceLoadScheduler::removeLoadIdentifier removing loader %s", loader->request().url().string().utf8().data()); HostRecord* host = loader->hostRecord(); // 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. if (host) host->removeLoader(loader); scheduleServePendingRequests(); }
void ResourceLoadScheduler::remove(ResourceLoader* resourceLoader) { ASSERT(resourceLoader); HostInformation* host = hostForURL(resourceLoader->url()); if (host) host->remove(resourceLoader); #if PLATFORM(IOS) // ResourceLoader::url() doesn't start returning the correct value until the load starts. If we get canceled before that, we need to look for originalRequest url instead. // FIXME: ResourceLoader::url() should be made to return a sensible value at all times. if (!resourceLoader->iOSOriginalRequest().isNull()) { HostInformation* originalHost = hostForURL(resourceLoader->iOSOriginalRequest().url()); if (originalHost && originalHost != host) originalHost->remove(resourceLoader); } #endif scheduleServePendingRequests(); }
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 NetworkResourceLoadScheduler::scheduleLoader(PassRefPtr<NetworkResourceLoader> loader) { ResourceLoadPriority priority = loader->priority(); const ResourceRequest& resourceRequest = loader->request(); LOG(NetworkScheduling, "(NetworkProcess) NetworkResourceLoadScheduler::scheduleLoader resource '%s'", resourceRequest.url().string().utf8().data()); HostRecord* host = hostForURL(resourceRequest.url(), CreateIfNotFound); bool hadRequests = host->hasRequests(); host->scheduleResourceLoader(loader); if (priority > ResourceLoadPriorityLow || !resourceRequest.url().protocolIsInHTTPFamily() || (priority == ResourceLoadPriorityLow && !hadRequests)) { // Try to request important resources immediately. host->servePendingRequests(priority); return; } // Handle asynchronously so early low priority requests don't get scheduled before later high priority ones. scheduleServePendingRequests(); }
void ResourceLoadScheduler::scheduleLoad(ResourceLoader* resourceLoader, ResourceLoadPriority priority) { ASSERT(resourceLoader); ASSERT(priority != ResourceLoadPriorityUnresolved); #if !REQUEST_MANAGEMENT_ENABLED priority = ResourceLoadPriorityHighest; #endif LOG(ResourceLoading, "ResourceLoadScheduler::load resource %p '%s'", resourceLoader, resourceLoader->url().string().latin1().data()); HostInformation* host = hostForURL(resourceLoader->url(), CreateIfNotFound); bool hadRequests = host->hasRequests(); host->schedule(resourceLoader, priority); if (priority > ResourceLoadPriorityLow || !resourceLoader->url().protocolInHTTPFamily() || (priority == ResourceLoadPriorityLow && !hadRequests)) { // Try to request important resources immediately. servePendingRequests(host, priority); return; } // Handle asynchronously so early low priority requests don't get scheduled before later high priority ones. InspectorInstrumentation::didScheduleResourceRequest(resourceLoader->frameLoader() ? resourceLoader->frameLoader()->frame()->document() : 0, resourceLoader->url()); scheduleServePendingRequests(); }
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)); }