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::crossOriginRedirectReceived(ResourceLoader* resourceLoader, const KURL& redirectURL) { HostInformation* oldHost = hostForURL(resourceLoader->url()); ASSERT(oldHost); HostInformation* newHost = hostForURL(redirectURL, CreateIfNotFound); if (oldHost->name() == newHost->name()) return; newHost->addLoadInProgress(resourceLoader); oldHost->remove(resourceLoader); }
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 ResourceLoadScheduler::remove(ResourceLoader* resourceLoader) { ASSERT(resourceLoader); HostInformation* host = hostForURL(resourceLoader->url()); if (host) host->remove(resourceLoader); 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 NetworkResourceLoadScheduler::receivedRedirect(NetworkResourceLoader* loader, const WebCore::URL& redirectURL) { ASSERT(RunLoop::isMain()); LOG(NetworkScheduling, "(NetworkProcess) NetworkResourceLoadScheduler::receivedRedirect loader originally for '%s' redirected to '%s'", loader->request().url().string().utf8().data(), redirectURL.string().utf8().data()); HostRecord* oldHost = loader->hostRecord(); // The load may have been cancelled while the message was in flight from network thread to main thread. if (!oldHost) return; HostRecord* newHost = hostForURL(redirectURL, CreateIfNotFound); if (oldHost->name() == newHost->name()) return; oldHost->removeLoader(loader); newHost->addLoaderInProgress(loader); }
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 ResourceLoadScheduler::addMainResourceLoad(ResourceLoader* resourceLoader) { hostForURL(resourceLoader->url(), CreateIfNotFound)->addLoadInProgress(resourceLoader); }