// Returns true if we should block the load. static bool processContentExtensionRulesForLoad(const Frame& frame, ResourceRequest& request, ResourceType resourceType) { auto* documentLoader = frame.loader().documentLoader(); if (!documentLoader) return false; auto* page = frame.page(); if (!page) return false; auto status = page->userContentProvider().processContentExtensionRulesForLoad(request.url(), resourceType, *documentLoader); applyBlockedStatusToRequest(status, request); return status.blockedLoad; }
void ResourceLoader::willSendRequestInternal(ResourceRequest& request, const ResourceResponse& redirectResponse) { // Protect this in this delegate method since the additional processing can do // anything including possibly derefing this; one example of this is Radar 3266216. Ref<ResourceLoader> protectedThis(*this); ASSERT(!m_reachedTerminalState); #if ENABLE(CONTENT_EXTENSIONS) ASSERT(m_resourceType != ResourceType::Invalid); #endif // We need a resource identifier for all requests, even if FrameLoader is never going to see it (such as with CORS preflight requests). bool createdResourceIdentifier = false; if (!m_identifier) { m_identifier = m_frame->page()->progress().createUniqueIdentifier(); createdResourceIdentifier = true; } #if ENABLE(CONTENT_EXTENSIONS) if (frameLoader()) { Page* page = frameLoader()->frame().page(); if (page && m_documentLoader) { auto blockedStatus = page->userContentProvider().processContentExtensionRulesForLoad(request.url(), m_resourceType, *m_documentLoader); applyBlockedStatusToRequest(blockedStatus, request); if (blockedStatus.blockedLoad) { request = { }; didFail(blockedByContentBlockerError()); return; } } } #endif if (request.isNull()) { didFail(cannotShowURLError()); return; } if (m_options.sendLoadCallbacks == SendCallbacks) { if (createdResourceIdentifier) frameLoader()->notifier().assignIdentifierToInitialRequest(m_identifier, documentLoader(), request); #if PLATFORM(IOS) // If this ResourceLoader was stopped as a result of assignIdentifierToInitialRequest, bail out if (m_reachedTerminalState) return; #endif frameLoader()->notifier().willSendRequest(this, request, redirectResponse); } else InspectorInstrumentation::willSendRequest(m_frame.get(), m_identifier, m_frame->loader().documentLoader(), request, redirectResponse); bool isRedirect = !redirectResponse.isNull(); if (isRedirect) platformStrategies()->loaderStrategy()->crossOriginRedirectReceived(this, request.url()); m_request = request; if (isRedirect) { auto& redirectURL = request.url(); if (!m_documentLoader->isCommitted()) frameLoader()->client().dispatchDidReceiveServerRedirectForProvisionalLoad(); if (redirectURL.protocolIsData()) { // Handle data URL decoding locally. finishNetworkLoad(); loadDataURL(); } } }