ResourceLoadPriority FrameFetchContext::modifyPriorityForExperiments(ResourceLoadPriority priority, Resource::Type type, const FetchRequest& request, ResourcePriority::VisibilityStatus visibility) { // An image fetch is used to distinguish between "early" and "late" scripts in a document if (type == Resource::Image) m_imageFetched = true; // If Settings is null, we can't verify any experiments are in force. if (!frame()->settings()) return priority; // If enabled, drop the priority of all resources in a subframe. if (frame()->settings()->lowPriorityIframes() && !frame()->isMainFrame()) return ResourceLoadPriorityVeryLow; // Async/Defer scripts. if (type == Resource::Script && FetchRequest::LazyLoad == request.defer()) return frame()->settings()->fetchIncreaseAsyncScriptPriority() ? ResourceLoadPriorityMedium : ResourceLoadPriorityLow; // Runtime experiment that change how we prioritize resources. // The toggles do not depend on each other and can be flipped individually // though the cumulative result will depend on the interaction between them. // Background doc: https://docs.google.com/document/d/1bCDuq9H1ih9iNjgzyAL0gpwNFiEP4TZS-YLRp_RuMlc/edit?usp=sharing // Increases the priorities for CSS, Scripts, Fonts and Images all by one level // and parser-blocking scripts and visible images by 2. // This is used in conjunction with logic on the Chrome side to raise the threshold // of "layout-blocking" resources and provide a boost to resources that are needed // as soon as possible for something currently on the screen. int modifiedPriority = static_cast<int>(priority); if (frame()->settings()->fetchIncreasePriorities()) { if (type == Resource::CSSStyleSheet || type == Resource::Script || type == Resource::Font || type == Resource::Image) modifiedPriority++; } // Always give visible resources a bump, and an additional bump if generally increasing priorities. if (visibility == ResourcePriority::Visible) { modifiedPriority++; if (frame()->settings()->fetchIncreasePriorities()) modifiedPriority++; } if (frame()->settings()->fetchIncreaseFontPriority() && type == Resource::Font) modifiedPriority++; if (type == Resource::Script) { // Reduce the priority of late-body scripts. if (frame()->settings()->fetchDeferLateScripts() && request.forPreload() && m_imageFetched) modifiedPriority--; // Parser-blocking scripts. if (frame()->settings()->fetchIncreasePriorities() && !request.forPreload()) modifiedPriority++; } // Clamp priority modifiedPriority = std::min(static_cast<int>(ResourceLoadPriorityHighest), std::max(static_cast<int>(ResourceLoadPriorityLowest), modifiedPriority)); return static_cast<ResourceLoadPriority>(modifiedPriority); }
ResourcePtr<ImageResource> ImageResource::fetch(FetchRequest& request, ResourceFetcher* fetcher) { if (request.resourceRequest().requestContext() == WebURLRequest::RequestContextUnspecified) request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextImage); if (fetcher->context().pageDismissalEventBeingDispatched()) { KURL requestURL = request.resourceRequest().url(); if (requestURL.isValid() && fetcher->context().canRequest(Resource::Image, request.resourceRequest(), requestURL, request.options(), request.forPreload(), request.originRestriction())) fetcher->context().sendImagePing(requestURL); return 0; } if (fetcher->clientDefersImage(request.resourceRequest().url())) request.setDefer(FetchRequest::DeferredByClient); return toImageResource(fetcher->requestResource(request, ImageResourceFactory())); }