Changeset 244544 in webkit
- Timestamp:
- Apr 23, 2019 9:14:05 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r244542 r244544 1 2019-04-23 John Wilander <wilander@apple.com> 2 3 Ad Click Attribution redirects to well-known location should not trigger a conversion if they are blocked by content blockers 4 https://bugs.webkit.org/show_bug.cgi?id=197183 5 <rdar://problem/47763188> 6 7 Reviewed by Alex Christensen. 8 9 * http/tests/contentextensions/block-ad-click-attribution-expected.txt: Added. 10 * http/tests/contentextensions/block-ad-click-attribution.html: Added. 11 * http/tests/contentextensions/block-ad-click-attribution.html.json: Added. 12 1 13 2019-04-23 Shawn Roberts <sroberts@apple.com> 2 14 -
trunk/Source/WebKit/ChangeLog
r244541 r244544 1 2019-04-23 John Wilander <wilander@apple.com> 2 3 Ad Click Attribution redirects to well-known location should not trigger a conversion if they are blocked by content blockers 4 https://bugs.webkit.org/show_bug.cgi?id=197183 5 <rdar://problem/47763188> 6 7 Reviewed by Alex Christensen. 8 9 Ad Click Attribution conversions are picked up in the redirect handler 10 in WebKit::NetworkResourceLoader. Content blocking typically happens in 11 the continued redirect request handling in the web content process and 12 a blocked request comes back empty. 13 14 We need to call the WebKit::NetworkLoadChecker in the network process 15 for these specific redirects, just like we do for Ping. 16 17 The change makes use of the existing function 18 NetworkLoadChecker::enableContentExtensionsCheck() for this purpose. 19 20 In essence, this change makes it possible to block all conversions made 21 to a "/.well-known/ad-click-attribution/" URL. 22 23 * NetworkProcess/NetworkResourceLoader.cpp: 24 (WebKit::NetworkResourceLoader::handleAdClickAttributionConversion): 25 New convenience function. 26 (WebKit::NetworkResourceLoader::willSendRedirectedRequest): 27 Now calls NetworkLoadChecker::enableContentExtensionsCheck() if 28 an Ad Click Attribution conversion was found in the redirect URL. 29 (WebKit::NetworkResourceLoader::continueWillSendRedirectedRequest): 30 If the request was not blocked, it will store any found conversion here. 31 * NetworkProcess/NetworkResourceLoader.h: 32 1 33 2019-04-23 Don Olmstead <don.olmstead@sony.com> 2 34 -
trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp
r244521 r244544 43 43 #include "WebResourceLoaderMessages.h" 44 44 #include "WebsiteDataStoreParameters.h" 45 #include <WebCore/AdClickAttribution.h>46 45 #include <WebCore/BlobDataFileReference.h> 47 46 #include <WebCore/CertificateInfo.h> … … 582 581 } 583 582 583 void NetworkResourceLoader::handleAdClickAttributionConversion(AdClickAttribution::Conversion&& conversion, const URL& requestURL, const WebCore::ResourceRequest& redirectRequest) 584 { 585 ASSERT(!sessionID().isEphemeral()); 586 587 RegistrableDomain redirectDomain { redirectRequest.url() }; 588 auto& firstPartyURL = redirectRequest.firstPartyForCookies(); 589 NetworkSession* networkSession = nullptr; 590 // The redirect has to be done by the same registrable domain and it has to be a third-party request. 591 if (redirectDomain.matches(requestURL) && !redirectDomain.matches(firstPartyURL) && (networkSession = m_connection->networkProcess().networkSession(sessionID()))) 592 networkSession->convertAdClickAttribution(AdClickAttribution::Source { WTFMove(redirectDomain) }, AdClickAttribution::Destination { firstPartyURL }, WTFMove(conversion)); 593 } 594 584 595 void NetworkResourceLoader::willSendRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse) 585 596 { 586 597 ++m_redirectCount; 587 598 588 auto& redirectURL = redirectRequest.url(); 589 if (!sessionID().isEphemeral()) { 590 if (auto adClickConversion = AdClickAttribution::parseConversionRequest(redirectURL)) { 591 RegistrableDomain redirectDomain { redirectURL }; 592 auto& firstPartyURL = redirectRequest.firstPartyForCookies(); 593 NetworkSession* networkSession = nullptr; 594 // The redirect has to be done by the same registrable domain and it has to be a third-party request. 595 if (redirectDomain.matches(request.url()) && !redirectDomain.matches(firstPartyURL) && (networkSession = m_connection->networkProcess().networkSession(sessionID()))) 596 networkSession->convertAdClickAttribution(AdClickAttribution::Source { WTFMove(redirectDomain) }, AdClickAttribution::Destination { firstPartyURL }, WTFMove(*adClickConversion)); 597 } 598 } 599 Optional<AdClickAttribution::Conversion> adClickConversion; 600 if (!sessionID().isEphemeral()) 601 adClickConversion = AdClickAttribution::parseConversionRequest(redirectRequest.url()); 599 602 600 603 auto maxAgeCap = validateCacheEntryForMaxAgeCapValidation(request, redirectRequest, redirectResponse); … … 603 606 604 607 if (m_networkLoadChecker) { 608 if (adClickConversion) 609 m_networkLoadChecker->enableContentExtensionsCheck(); 605 610 m_networkLoadChecker->storeRedirectionIfNeeded(request, redirectResponse); 606 m_networkLoadChecker->checkRedirection(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse), this, [protectedThis = makeRef(*this), this, storedCredentialsPolicy = m_networkLoadChecker->storedCredentialsPolicy() ](auto&& result) mutable {611 m_networkLoadChecker->checkRedirection(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse), this, [protectedThis = makeRef(*this), this, storedCredentialsPolicy = m_networkLoadChecker->storedCredentialsPolicy(), adClickConversion = WTFMove(adClickConversion)](auto&& result) mutable { 607 612 if (!result.has_value()) { 608 613 if (result.error().isCancellation()) … … 632 637 633 638 m_shouldRestartLoad = storedCredentialsPolicy != m_networkLoadChecker->storedCredentialsPolicy(); 634 this->continueWillSendRedirectedRequest(WTFMove(result->request), WTFMove(result->redirectRequest), WTFMove(result->redirectResponse) );639 this->continueWillSendRedirectedRequest(WTFMove(result->request), WTFMove(result->redirectRequest), WTFMove(result->redirectResponse), WTFMove(adClickConversion)); 635 640 }); 636 641 return; 637 642 } 638 continueWillSendRedirectedRequest(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse) );639 } 640 641 void NetworkResourceLoader::continueWillSendRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse )643 continueWillSendRedirectedRequest(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse), WTFMove(adClickConversion)); 644 } 645 646 void NetworkResourceLoader::continueWillSendRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse, Optional<AdClickAttribution::Conversion>&& adClickConversion) 642 647 { 643 648 ASSERT(!isSynchronous()); 644 649 650 if (adClickConversion) 651 handleAdClickAttributionConversion(WTFMove(*adClickConversion), request.url(), redirectRequest); 645 652 send(Messages::WebResourceLoader::WillSendRequest(redirectRequest, sanitizeResponseIfPossible(WTFMove(redirectResponse), ResourceResponse::SanitizationType::Redirection))); 646 653 } -
trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h
r244428 r244544 32 32 #include "NetworkLoadClient.h" 33 33 #include "NetworkResourceLoadParameters.h" 34 #include <WebCore/AdClickAttribution.h> 34 35 #include <WebCore/ContentSecurityPolicyClient.h> 35 36 #include <WebCore/ResourceResponse.h> … … 160 161 #endif 161 162 162 void continueWillSendRedirectedRequest(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&& );163 void continueWillSendRedirectedRequest(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&&, Optional<WebCore::AdClickAttribution::Conversion>&&); 163 164 void didFinishWithRedirectResponse(WebCore::ResourceResponse&&); 164 165 WebCore::ResourceResponse sanitizeResponseIfPossible(WebCore::ResourceResponse&&, WebCore::ResourceResponse::SanitizationType); … … 170 171 171 172 void logSlowCacheRetrieveIfNeeded(const NetworkCache::Cache::RetrieveInfo&); 173 174 void handleAdClickAttributionConversion(WebCore::AdClickAttribution::Conversion&&, const URL&, const WebCore::ResourceRequest&); 172 175 173 176 Optional<Seconds> validateCacheEntryForMaxAgeCapValidation(const WebCore::ResourceRequest&, const WebCore::ResourceRequest& redirectRequest, const WebCore::ResourceResponse&);
Note: See TracChangeset
for help on using the changeset viewer.