Changeset 283316 in webkit
- Timestamp:
- Sep 30, 2021, 9:22:01 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 35 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/tests/privateClickMeasurement/multiple-app-bundle-ids-expected.txt (added)
-
LayoutTests/http/tests/privateClickMeasurement/multiple-app-bundle-ids.html (added)
-
LayoutTests/http/tests/privateClickMeasurement/resources/util.js (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/loader/PrivateClickMeasurement.cpp (modified) (1 diff)
-
Source/WebCore/loader/PrivateClickMeasurement.h (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkProcess.cpp (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkProcess.h (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkProcess.messages.in (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkSession.cpp (modified) (3 diffs)
-
Source/WebKit/NetworkProcess/NetworkSession.h (modified) (1 diff)
-
Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.cpp (modified) (17 diffs)
-
Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.h (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.cpp (modified) (7 diffs)
-
Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.h (modified) (4 diffs)
-
Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerInterface.cpp (modified) (4 diffs)
-
Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerInterface.h (modified) (4 diffs)
-
Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerProxy.cpp (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerProxy.h (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementStore.cpp (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementStore.h (modified) (1 diff)
-
Source/WebKit/UIProcess/API/C/WKPage.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/API/C/WKPagePrivate.h (modified) (1 diff)
-
Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h (modified) (1 diff)
-
Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm (modified) (1 diff)
-
Source/WebKit/UIProcess/WebPageProxy.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/WebPageProxy.h (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm (modified) (1 diff)
-
Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl (modified) (1 diff)
-
Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp (modified) (1 diff)
-
Tools/WebKitTestRunner/InjectedBundle/TestRunner.h (modified) (1 diff)
-
Tools/WebKitTestRunner/TestController.cpp (modified) (1 diff)
-
Tools/WebKitTestRunner/TestController.h (modified) (1 diff)
-
Tools/WebKitTestRunner/TestInvocation.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r283312 r283316 1 2021-09-30 John Wilander <wilander@apple.com> 2 3 PCM: Take app bundle ID into consideration when matching triggering events with pending clicks 4 https://bugs.webkit.org/show_bug.cgi?id=230778 5 <rdar://problem/83516528> 6 7 Reviewed by Alex Christensen. 8 9 https://commits.webkit.org/r282884 added app bundle IDs to unattributed 10 and attributed clicks in PCM. This patch makes sure we take those IDs 11 into consideration in PCM::Database::attributePrivateClickMeasurement(). 12 13 * http/tests/privateClickMeasurement/multiple-app-bundle-ids-expected.txt: Added. 14 * http/tests/privateClickMeasurement/multiple-app-bundle-ids.html: Added. 15 * http/tests/privateClickMeasurement/resources/util.js: 16 (tearDownAndFinish): 17 1 18 2021-09-30 Alan Bujtas <zalan@apple.com> 2 19 -
trunk/LayoutTests/http/tests/privateClickMeasurement/resources/util.js
r281480 r283316 16 16 testRunner.setPrivateClickMeasurementTokenSignatureURLForTesting(""); 17 17 testRunner.setPrivateClickMeasurementTokenPublicKeyURLForTesting(""); 18 testRunner.setPrivateClickMeasurementAppBundleIDForTesting(""); 18 19 testRunner.notifyDone(); 19 20 } -
trunk/Source/WebCore/ChangeLog
r283315 r283316 1 2021-09-30 John Wilander <wilander@apple.com> 2 3 PCM: Take app bundle ID into consideration when matching triggering events with pending clicks 4 https://bugs.webkit.org/show_bug.cgi?id=230778 5 <rdar://problem/83516528> 6 7 Reviewed by Alex Christensen. 8 9 https://commits.webkit.org/r282884 added app bundle IDs to unattributed 10 and attributed clicks in PCM. This patch makes sure we take those IDs 11 into consideration in PCM::Database::attributePrivateClickMeasurement(). 12 13 The WebCore part makes sure that a temporary app bundle ID can be set 14 on attributions that get stored in PCM's database. 15 16 Test: http/tests/privateClickMeasurement/multiple-app-bundle-ids.html 17 18 * loader/PrivateClickMeasurement.cpp: 19 (WebCore::PrivateClickMeasurement::setSourceApplicationBundleIDForTesting): 20 * loader/PrivateClickMeasurement.h: 21 1 22 2021-09-30 Youenn Fablet <youenn@apple.com> 2 23 -
trunk/Source/WebCore/loader/PrivateClickMeasurement.cpp
r283313 r283316 143 143 } 144 144 145 void PrivateClickMeasurement::setSourceApplicationBundleIDForTesting(const String& appBundleIDForTesting) 146 { 147 m_sourceApplicationBundleID = appBundleIDForTesting; 148 } 149 145 150 static Seconds randomlyBetweenTwentyFourAndFortyEightHours() 146 151 { -
trunk/Source/WebCore/loader/PrivateClickMeasurement.h
r283313 r283316 330 330 void setAttribution(AttributionTriggerData&& attributionTriggerData) { m_attributionTriggerData = WTFMove(attributionTriggerData); } 331 331 const String& sourceApplicationBundleID() const { return m_sourceApplicationBundleID; } 332 WEBCORE_EXPORT void setSourceApplicationBundleIDForTesting(const String&); 332 333 333 334 bool isEphemeral() const { return m_isEphemeral == AttributionEphemeral::Yes; } -
trunk/Source/WebKit/ChangeLog
r283313 r283316 1 2021-09-30 John Wilander <wilander@apple.com> 2 3 PCM: Take app bundle ID into consideration when matching triggering events with pending clicks 4 https://bugs.webkit.org/show_bug.cgi?id=230778 5 <rdar://problem/83516528> 6 7 Reviewed by Alex Christensen. 8 9 https://commits.webkit.org/r282884 added app bundle IDs to unattributed 10 and attributed clicks in PCM. This patch makes sure we take those IDs 11 into consideration in PCM::Database::attributePrivateClickMeasurement(). 12 13 A lot of the WebKit part is: 14 - Piping through app bundle IDs from the network session to the PCM 15 database where the ID will be matched against stored app bundle IDs. 16 - Piping through test configuration for app bundle ID. 17 18 The real change is in PCM::Database which is explained below. 19 20 Test: http/tests/privateClickMeasurement/multiple-app-bundle-ids.html 21 22 * NetworkProcess/NetworkProcess.cpp: 23 (WebKit::NetworkProcess::setPrivateClickMeasurementAppBundleIDForTesting): 24 * NetworkProcess/NetworkProcess.h: 25 * NetworkProcess/NetworkProcess.messages.in: 26 * NetworkProcess/NetworkSession.cpp: 27 (WebKit::NetworkSession::handlePrivateClickMeasurementConversion): 28 (WebKit::NetworkSession::setPrivateClickMeasurementAppBundleIDForTesting): 29 * NetworkProcess/NetworkSession.h: 30 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.cpp: 31 (WebKit::PCM::Database::findPrivateClickMeasurement): 32 Now takes an app bundle ID supplied from the network session and 33 includes it in the database query to find matching entries. If and 34 attribution was saved with app bundle ID XYZ, it should only be 35 be converted in an application with app bundle ID XYZ. 36 (WebKit::PCM::Database::attributePrivateClickMeasurement): 37 This function calls PCM::Database::findPrivateClickMeasurement() 38 which needs the app bundle ID so that ID is forwarded through. 39 (WebKit::PCM::Database::removeUnattributed): 40 Also needs to take the app bundle ID into consideration. 41 (WebKit::PCM::Database::clearSentAttribution): 42 Also needs to take the app bundle ID into consideration. 43 (WebKit::PCM::Database::markReportAsSentToDestination): 44 Also needs to take the app bundle ID into consideration. 45 (WebKit::PCM::Database::markReportAsSentToSource): 46 Also needs to take the app bundle ID into consideration. 47 (WebKit::PCM::Database::earliestTimesToSend): 48 Also needs to take the app bundle ID into consideration. 49 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.h: 50 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.cpp: 51 (WebKit::PrivateClickMeasurementManager::storeUnattributed): 52 (WebKit::PrivateClickMeasurementManager::handleAttribution): 53 (WebKit::PrivateClickMeasurementManager::setPrivateClickMeasurementAppBundleIDForTesting): 54 (WebKit::PrivateClickMeasurementManager::attribute): 55 (WebKit::PrivateClickMeasurementManager::clear): 56 Clears the test setting for app bundle ID. 57 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.h: 58 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerInterface.cpp: 59 (WebKit::PCM::messageTypeSendsReply): 60 (WebKit::PCM::decodeMessageAndSendToManager): 61 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerInterface.h: 62 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerProxy.cpp: 63 (WebKit::PCM::ManagerProxy::handleAttribution): 64 (WebKit::PCM::ManagerProxy::setPrivateClickMeasurementAppBundleIDForTesting): 65 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerProxy.h: 66 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementStore.cpp: 67 (WebKit::PCM::Store::attributePrivateClickMeasurement): 68 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementStore.h: 69 * UIProcess/API/C/WKPage.cpp: 70 (WKPageSetPCMFraudPreventionValuesForTesting): 71 (WKPageSetPrivateClickMeasurementAppBundleIDForTesting): 72 * UIProcess/API/C/WKPagePrivate.h: 73 * UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h: 74 * UIProcess/API/Cocoa/WKWebViewTesting.mm: 75 (-[WKWebView _setPrivateClickMeasurementAppBundleIDForTesting:completionHandler:]): 76 * UIProcess/WebPageProxy.cpp: 77 (WebKit::WebPageProxy::setPrivateClickMeasurementAppBundleIDForTesting): 78 * UIProcess/WebPageProxy.h: 79 1 80 2021-09-30 Alex Christensen <achristensen@webkit.org> 2 81 -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r283295 r283316 2690 2690 } 2691 2691 2692 void NetworkProcess::setPrivateClickMeasurementAppBundleIDForTesting(PAL::SessionID sessionID, String&& appBundleIDForTesting, CompletionHandler<void()>&& completionHandler) 2693 { 2694 if (auto* session = networkSession(sessionID)) 2695 session->setPrivateClickMeasurementAppBundleIDForTesting(WTFMove(appBundleIDForTesting)); 2696 2697 completionHandler(); 2698 } 2699 2692 2700 void NetworkProcess::addKeptAliveLoad(Ref<NetworkResourceLoader>&& loader) 2693 2701 { -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.h
r283183 r283316 351 351 void markPrivateClickMeasurementsAsExpiredForTesting(PAL::SessionID, CompletionHandler<void()>&&); 352 352 void setPCMFraudPreventionValuesForTesting(PAL::SessionID, String&& unlinkableToken, String&& secretToken, String&& signature, String&& keyID, CompletionHandler<void()>&&); 353 void setPrivateClickMeasurementAppBundleIDForTesting(PAL::SessionID, String&& appBundleIDForTesting, CompletionHandler<void()>&&); 353 354 354 355 RefPtr<WebCore::StorageQuotaManager> storageQuotaManager(PAL::SessionID, const WebCore::ClientOrigin&); -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in
r283183 r283316 172 172 MarkPrivateClickMeasurementsAsExpiredForTesting(PAL::SessionID sessionID) -> () Async 173 173 SetPCMFraudPreventionValuesForTesting(PAL::SessionID sessionID, String secretToken, String unlinkableToken, String signature, String keyID) -> () Async 174 SetPrivateClickMeasurementAppBundleIDForTesting(PAL::SessionID sessionID, String appBundleIDForTesting) -> () Async 174 175 GetLocalStorageOriginDetails(PAL::SessionID sessionID) -> (Vector<WebKit::LocalStorageDatabaseTracker::OriginDetails> details) Async 175 176 -
trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp
r283295 r283316 45 45 #include <WebCore/CookieJar.h> 46 46 #include <WebCore/ResourceRequest.h> 47 #include <WebCore/RuntimeApplicationChecks.h> 47 48 48 49 #if PLATFORM(COCOA) 50 #include "DefaultWebBrowserChecks.h" 49 51 #include "NetworkSessionCocoa.h" 50 52 #endif … … 325 327 void NetworkSession::handlePrivateClickMeasurementConversion(PrivateClickMeasurement::AttributionTriggerData&& attributionTriggerData, const URL& requestURL, const WebCore::ResourceRequest& redirectRequest) 326 328 { 327 privateClickMeasurement().handleAttribution(WTFMove(attributionTriggerData), requestURL, RegistrableDomain(redirectRequest.url()), redirectRequest.firstPartyForCookies()); 329 #if PLATFORM(COCOA) 330 auto appBundleID = WebCore::applicationBundleIdentifier(); 331 #else 332 auto appBundleID = String(); 333 #endif 334 privateClickMeasurement().handleAttribution(WTFMove(attributionTriggerData), requestURL, RegistrableDomain(redirectRequest.url()), redirectRequest.firstPartyForCookies(), appBundleID); 328 335 } 329 336 … … 392 399 { 393 400 privateClickMeasurement().allowTLSCertificateChainForLocalPCMTesting(certificateInfo); 401 } 402 403 void NetworkSession::setPrivateClickMeasurementAppBundleIDForTesting(String&& appBundleIDForTesting) 404 { 405 #if PLATFORM(COCOA) 406 RELEASE_ASSERT(isRunningTest(WebCore::applicationBundleIdentifier())); 407 #endif 408 privateClickMeasurement().setPrivateClickMeasurementAppBundleIDForTesting(WTFMove(appBundleIDForTesting)); 394 409 } 395 410 -
trunk/Source/WebKit/NetworkProcess/NetworkSession.h
r283295 r283316 142 142 void firePrivateClickMeasurementTimerImmediatelyForTesting(); 143 143 void allowTLSCertificateChainForLocalPCMTesting(const WebCore::CertificateInfo&); 144 void setPrivateClickMeasurementAppBundleIDForTesting(String&&); 144 145 145 146 void addKeptAliveLoad(Ref<NetworkResourceLoader>&&); -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.cpp
r283227 r283316 44 44 constexpr auto insertAttributedPrivateClickMeasurementQuery = "INSERT OR REPLACE INTO AttributedPrivateClickMeasurement (sourceSiteDomainID, destinationSiteDomainID, " 45 45 "sourceID, attributionTriggerData, priority, timeOfAdClick, earliestTimeToSendToSource, token, signature, keyID, earliestTimeToSendToDestination, sourceApplicationBundleID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"_s; 46 constexpr auto findUnattributedQuery = "SELECT * FROM UnattributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? "_s;47 constexpr auto findAttributedQuery = "SELECT * FROM AttributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? "_s;48 constexpr auto removeUnattributedQuery = "DELETE FROM UnattributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? "_s;46 constexpr auto findUnattributedQuery = "SELECT * FROM UnattributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? AND sourceApplicationBundleID = ?"_s; 47 constexpr auto findAttributedQuery = "SELECT * FROM AttributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? AND sourceApplicationBundleID = ?"_s; 48 constexpr auto removeUnattributedQuery = "DELETE FROM UnattributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? AND sourceApplicationBundleID = ?"_s; 49 49 constexpr auto allAttributedPrivateClickMeasurementQuery = "SELECT *, MIN(earliestTimeToSendToSource, earliestTimeToSendToDestination) as minVal " 50 50 "FROM AttributedPrivateClickMeasurement WHERE earliestTimeToSendToSource IS NOT NULL AND earliestTimeToSendToDestination IS NOT NULL " … … 53 53 constexpr auto allUnattributedPrivateClickMeasurementAttributionsQuery = "SELECT * FROM UnattributedPrivateClickMeasurement"_s; 54 54 constexpr auto clearExpiredPrivateClickMeasurementQuery = "DELETE FROM UnattributedPrivateClickMeasurement WHERE ? > timeOfAdClick"_s; 55 constexpr auto markReportAsSentToSourceQuery = "UPDATE AttributedPrivateClickMeasurement SET earliestTimeToSendToSource = null WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? "_s;56 constexpr auto markReportAsSentToDestinationQuery = "UPDATE AttributedPrivateClickMeasurement SET earliestTimeToSendToDestination = null WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? "_s;57 constexpr auto earliestTimesToSendQuery = "SELECT earliestTimeToSendToSource, earliestTimeToSendToDestination FROM AttributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? "_s;55 constexpr auto markReportAsSentToSourceQuery = "UPDATE AttributedPrivateClickMeasurement SET earliestTimeToSendToSource = null WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? AND sourceApplicationBundleID = ?"_s; 56 constexpr auto markReportAsSentToDestinationQuery = "UPDATE AttributedPrivateClickMeasurement SET earliestTimeToSendToDestination = null WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? AND sourceApplicationBundleID = ?"_s; 57 constexpr auto earliestTimesToSendQuery = "SELECT earliestTimeToSendToSource, earliestTimeToSendToDestination FROM AttributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? AND sourceApplicationBundleID = ?"_s; 58 58 constexpr auto domainIDFromStringQuery = "SELECT domainID FROM PCMObservedDomains WHERE registrableDomain = ?"_s; 59 59 constexpr auto domainStringFromDomainIDQuery = "SELECT registrableDomain FROM PCMObservedDomains WHERE domainID = ?"_s; … … 238 238 } 239 239 240 std::pair<std::optional<Database::UnattributedPrivateClickMeasurement>, std::optional<Database::AttributedPrivateClickMeasurement>> Database::findPrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite& sourceSite, const WebCore::PrivateClickMeasurement::AttributionDestinationSite& destinationSite )240 std::pair<std::optional<Database::UnattributedPrivateClickMeasurement>, std::optional<Database::AttributedPrivateClickMeasurement>> Database::findPrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite& sourceSite, const WebCore::PrivateClickMeasurement::AttributionDestinationSite& destinationSite, const ApplicationBundleIdentifier& applicationBundleIdentifier) 241 241 { 242 242 ASSERT(!RunLoop::isMain()); … … 249 249 if (!findUnattributedScopedStatement 250 250 || findUnattributedScopedStatement->bindInt(1, *sourceSiteDomainID) != SQLITE_OK 251 || findUnattributedScopedStatement->bindInt(2, *destinationSiteDomainID) != SQLITE_OK) { 251 || findUnattributedScopedStatement->bindInt(2, *destinationSiteDomainID) != SQLITE_OK 252 || findUnattributedScopedStatement->bindText(3, applicationBundleIdentifier) != SQLITE_OK) { 252 253 RELEASE_LOG_ERROR(PrivateClickMeasurement, "%p - Database::findPrivateClickMeasurement findUnattributedQuery, error message: %" PRIVATE_LOG_STRING, this, m_database.lastErrorMsg()); 253 254 ASSERT_NOT_REACHED(); … … 257 258 if (!findAttributedScopedStatement 258 259 || findAttributedScopedStatement->bindInt(1, *sourceSiteDomainID) != SQLITE_OK 259 || findAttributedScopedStatement->bindInt(2, *destinationSiteDomainID) != SQLITE_OK) { 260 || findAttributedScopedStatement->bindInt(2, *destinationSiteDomainID) != SQLITE_OK 261 || findAttributedScopedStatement->bindText(3, applicationBundleIdentifier) != SQLITE_OK) { 260 262 RELEASE_LOG_ERROR(PrivateClickMeasurement, "%p - Database::findPrivateClickMeasurement findAttributedQuery, error message: %" PRIVATE_LOG_STRING, this, m_database.lastErrorMsg()); 261 263 ASSERT_NOT_REACHED(); … … 273 275 } 274 276 275 std::pair<std::optional<WebCore::PrivateClickMeasurement::AttributionSecondsUntilSendData>, DebugInfo> Database::attributePrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite& sourceSite, const WebCore::PrivateClickMeasurement::AttributionDestinationSite& destinationSite, WebCore::PrivateClickMeasurement::AttributionTriggerData&& attributionTriggerData)277 std::pair<std::optional<WebCore::PrivateClickMeasurement::AttributionSecondsUntilSendData>, DebugInfo> Database::attributePrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite& sourceSite, const WebCore::PrivateClickMeasurement::AttributionDestinationSite& destinationSite, const ApplicationBundleIdentifier& applicationBundleIdentifier, WebCore::PrivateClickMeasurement::AttributionTriggerData&& attributionTriggerData) 276 278 { 277 279 ASSERT(!RunLoop::isMain()); … … 292 294 WebCore::PrivateClickMeasurement::AttributionSecondsUntilSendData secondsUntilSend { std::nullopt, std::nullopt }; 293 295 294 auto attribution = findPrivateClickMeasurement(sourceSite, destinationSite );296 auto attribution = findPrivateClickMeasurement(sourceSite, destinationSite, applicationBundleIdentifier); 295 297 auto& previouslyUnattributed = attribution.first; 296 298 auto& previouslyAttributed = attribution.second; … … 351 353 || scopedStatement->bindInt(1, *sourceSiteDomainID) != SQLITE_OK 352 354 || scopedStatement->bindInt(2, *destinationSiteDomainID) != SQLITE_OK 355 || scopedStatement->bindText(3, attribution.sourceApplicationBundleID()) != SQLITE_OK 353 356 || scopedStatement->step() != SQLITE_DONE) { 354 357 RELEASE_LOG_ERROR(PrivateClickMeasurement, "%p - Database::removeUnattributed, error message: %" PRIVATE_LOG_STRING, this, m_database.lastErrorMsg()); … … 523 526 auto sourceSiteDomainID = domainID(attribution.sourceSite().registrableDomain); 524 527 auto destinationSiteDomainID = domainID(attribution.destinationSite().registrableDomain); 528 auto sourceApplicationBundleID = attribution.sourceApplicationBundleID(); 525 529 526 530 if (!sourceSiteDomainID || !destinationSiteDomainID) … … 533 537 return; 534 538 } 535 markReportAsSentToSource(*sourceSiteDomainID, *destinationSiteDomainID );539 markReportAsSentToSource(*sourceSiteDomainID, *destinationSiteDomainID, sourceApplicationBundleID); 536 540 sourceEarliestTimeToSend = std::nullopt; 537 541 break; … … 541 545 return; 542 546 } 543 markReportAsSentToDestination(*sourceSiteDomainID, *destinationSiteDomainID );547 markReportAsSentToDestination(*sourceSiteDomainID, *destinationSiteDomainID, sourceApplicationBundleID); 544 548 destinationEarliestTimeToSend = std::nullopt; 545 549 } … … 549 553 return; 550 554 551 auto clearAttributedStatement = m_database.prepareStatement("DELETE FROM AttributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? "_s);555 auto clearAttributedStatement = m_database.prepareStatement("DELETE FROM AttributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ? AND sourceApplicationBundleID = ?"_s); 552 556 if (!clearAttributedStatement 553 557 || clearAttributedStatement->bindInt(1, *sourceSiteDomainID) != SQLITE_OK 554 558 || clearAttributedStatement->bindInt(2, *destinationSiteDomainID) != SQLITE_OK 559 || clearAttributedStatement->bindText(3, sourceApplicationBundleID) != SQLITE_OK 555 560 || clearAttributedStatement->step() != SQLITE_DONE) { 556 561 RELEASE_LOG_ERROR(PrivateClickMeasurement, "%p - Database::clearSentAttribution failed to step, error message: %" PRIVATE_LOG_STRING, this, m_database.lastErrorMsg()); … … 559 564 } 560 565 561 void Database::markReportAsSentToDestination(SourceDomainID sourceSiteDomainID, DestinationDomainID destinationSiteDomainID )566 void Database::markReportAsSentToDestination(SourceDomainID sourceSiteDomainID, DestinationDomainID destinationSiteDomainID, const ApplicationBundleIdentifier& sourceApplicationBundleID) 562 567 { 563 568 ASSERT(!RunLoop::isMain()); … … 567 572 || scopedStatement->bindInt(1, sourceSiteDomainID) != SQLITE_OK 568 573 || scopedStatement->bindInt(2, destinationSiteDomainID) != SQLITE_OK 574 || scopedStatement->bindText(3, sourceApplicationBundleID) != SQLITE_OK 569 575 || scopedStatement->step() != SQLITE_DONE) { 570 576 RELEASE_LOG_ERROR(PrivateClickMeasurement, "Database::markReportAsSentToDestination, error message: %" PUBLIC_LOG_STRING, m_database.lastErrorMsg()); … … 573 579 } 574 580 575 void Database::markReportAsSentToSource(SourceDomainID sourceSiteDomainID, DestinationDomainID destinationSiteDomainID )581 void Database::markReportAsSentToSource(SourceDomainID sourceSiteDomainID, DestinationDomainID destinationSiteDomainID, const ApplicationBundleIdentifier& sourceApplicationBundleID) 576 582 { 577 583 ASSERT(!RunLoop::isMain()); … … 581 587 || scopedStatement->bindInt(1, sourceSiteDomainID) != SQLITE_OK 582 588 || scopedStatement->bindInt(2, destinationSiteDomainID) != SQLITE_OK 589 || scopedStatement->bindText(3, sourceApplicationBundleID) != SQLITE_OK 583 590 || scopedStatement->step() != SQLITE_DONE) { 584 591 RELEASE_LOG_ERROR(PrivateClickMeasurement, "Database::markReportAsSentToSource, error message: %" PUBLIC_LOG_STRING, m_database.lastErrorMsg()); … … 601 608 || scopedStatement->bindInt(1, *sourceSiteDomainID) != SQLITE_OK 602 609 || scopedStatement->bindInt(2, *destinationSiteDomainID) != SQLITE_OK 610 || scopedStatement->bindText(3, attribution.sourceApplicationBundleID()) != SQLITE_OK 603 611 || scopedStatement->step() != SQLITE_ROW) { 604 612 RELEASE_LOG_ERROR(PrivateClickMeasurement, "Database::earliestTimesToSend, error message: %" PUBLIC_LOG_STRING, m_database.lastErrorMsg()); -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.h
r283227 r283316 43 43 virtual ~Database(); 44 44 45 using ApplicationBundleIdentifier = String; 46 45 47 static void interruptAllDatabases(); 46 48 47 49 void insertPrivateClickMeasurement(WebCore::PrivateClickMeasurement&&, PrivateClickMeasurementAttributionType); 48 std::pair<std::optional<WebCore::PrivateClickMeasurement::AttributionSecondsUntilSendData>, DebugInfo> attributePrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite&, const WebCore::PrivateClickMeasurement::AttributionDestinationSite&, WebCore::PrivateClickMeasurement::AttributionTriggerData&&);50 std::pair<std::optional<WebCore::PrivateClickMeasurement::AttributionSecondsUntilSendData>, DebugInfo> attributePrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite&, const WebCore::PrivateClickMeasurement::AttributionDestinationSite&, const ApplicationBundleIdentifier&, WebCore::PrivateClickMeasurement::AttributionTriggerData&&); 49 51 Vector<WebCore::PrivateClickMeasurement> allAttributedPrivateClickMeasurement(); 50 52 void clearPrivateClickMeasurement(std::optional<WebCore::RegistrableDomain>); … … 67 69 bool createSchema() final; 68 70 void destroyStatements() final; 69 std::pair<std::optional<UnattributedPrivateClickMeasurement>, std::optional<AttributedPrivateClickMeasurement>> findPrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite&, const WebCore::PrivateClickMeasurement::AttributionDestinationSite& );71 std::pair<std::optional<UnattributedPrivateClickMeasurement>, std::optional<AttributedPrivateClickMeasurement>> findPrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite&, const WebCore::PrivateClickMeasurement::AttributionDestinationSite&, const ApplicationBundleIdentifier&); 70 72 void removeUnattributed(WebCore::PrivateClickMeasurement&); 71 73 String attributionToStringForTesting(const WebCore::PrivateClickMeasurement&) const; 72 void markReportAsSentToDestination(SourceDomainID, DestinationDomainID );73 void markReportAsSentToSource(SourceDomainID, DestinationDomainID );74 void markReportAsSentToDestination(SourceDomainID, DestinationDomainID, const ApplicationBundleIdentifier&); 75 void markReportAsSentToSource(SourceDomainID, DestinationDomainID, const ApplicationBundleIdentifier&); 74 76 std::pair<std::optional<SourceEarliestTimeToSend>, std::optional<DestinationEarliestTimeToSend>> earliestTimesToSend(const WebCore::PrivateClickMeasurement&); 75 77 std::optional<DomainID> ensureDomainID(const WebCore::RegistrableDomain&); -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.cpp
r283313 r283316 78 78 clearExpired(); 79 79 80 if (m_privateClickMeasurementAppBundleIDForTesting) 81 measurement.setSourceApplicationBundleIDForTesting(*m_privateClickMeasurementAppBundleIDForTesting); 82 80 83 if (measurement.ephemeralSourceNonce()) { 81 84 auto measurementCopy = measurement; … … 231 234 } 232 235 233 void PrivateClickMeasurementManager::handleAttribution(AttributionTriggerData&& attributionTriggerData, const URL& requestURL, WebCore::RegistrableDomain&& redirectDomain, const URL& firstPartyURL )236 void PrivateClickMeasurementManager::handleAttribution(AttributionTriggerData&& attributionTriggerData, const URL& requestURL, WebCore::RegistrableDomain&& redirectDomain, const URL& firstPartyURL, const ApplicationBundleIdentifier& applicationBundleIdentifier) 234 237 { 235 238 if (!featureEnabled()) … … 248 251 m_client->broadcastConsoleMessage(MessageLevel::Log, "[Private Click Measurement] Triggering event accepted."_s); 249 252 250 attribute(SourceSite { WTFMove(redirectDomain) }, AttributionDestinationSite { firstPartyURL }, WTFMove(attributionTriggerData) );253 attribute(SourceSite { WTFMove(redirectDomain) }, AttributionDestinationSite { firstPartyURL }, WTFMove(attributionTriggerData), m_privateClickMeasurementAppBundleIDForTesting ? *m_privateClickMeasurementAppBundleIDForTesting : applicationBundleIdentifier); 251 254 } 252 255 … … 256 259 } 257 260 261 void PrivateClickMeasurementManager::setPrivateClickMeasurementAppBundleIDForTesting(ApplicationBundleIdentifier&& appBundleID) 262 { 263 if (appBundleID.isEmpty()) 264 m_privateClickMeasurementAppBundleIDForTesting = std::nullopt; 265 else 266 m_privateClickMeasurementAppBundleIDForTesting = WTFMove(appBundleID); 267 } 268 258 269 void PrivateClickMeasurementManager::startTimer(Seconds seconds) 259 270 { … … 261 272 } 262 273 263 void PrivateClickMeasurementManager::attribute(const SourceSite& sourceSite, const AttributionDestinationSite& destinationSite, AttributionTriggerData&& attributionTriggerData )274 void PrivateClickMeasurementManager::attribute(const SourceSite& sourceSite, const AttributionDestinationSite& destinationSite, AttributionTriggerData&& attributionTriggerData, const ApplicationBundleIdentifier& applicationBundleIdentifier) 264 275 { 265 276 if (!featureEnabled()) … … 274 285 } 275 286 276 store().attributePrivateClickMeasurement(sourceSite, destinationSite, WTFMove(attributionTriggerData), std::exchange(m_ephemeralMeasurement, std::nullopt), [this, weakThis = makeWeakPtr(*this)] (auto attributionSecondsUntilSendData, auto debugInfo) {287 store().attributePrivateClickMeasurement(sourceSite, destinationSite, applicationBundleIdentifier, WTFMove(attributionTriggerData), std::exchange(m_ephemeralMeasurement, std::nullopt), [this, weakThis = makeWeakPtr(*this)] (auto attributionSecondsUntilSendData, auto debugInfo) { 277 288 if (!weakThis) 278 289 return; … … 437 448 m_ephemeralMeasurement = std::nullopt; 438 449 m_isRunningEphemeralMeasurementTest = false; 450 m_privateClickMeasurementAppBundleIDForTesting = std::nullopt; 439 451 440 452 if (!featureEnabled()) -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.h
r282269 r283316 46 46 ~PrivateClickMeasurementManager(); 47 47 48 using ApplicationBundleIdentifier = String; 49 48 50 void storeUnattributed(PrivateClickMeasurement&&) final; 49 void handleAttribution(AttributionTriggerData&&, const URL& requestURL, WebCore::RegistrableDomain&& redirectDomain, const URL& firstPartyURL ) final;51 void handleAttribution(AttributionTriggerData&&, const URL& requestURL, WebCore::RegistrableDomain&& redirectDomain, const URL& firstPartyURL, const ApplicationBundleIdentifier&) final; 50 52 void clear(CompletionHandler<void()>&&) final; 51 53 void clearForRegistrableDomain(const RegistrableDomain&, CompletionHandler<void()>&&) final; … … 62 64 void setPCMFraudPreventionValuesForTesting(String&& unlinkableToken, String&& secretToken, String&& signature, String&& keyID) final; 63 65 void startTimerImmediatelyForTesting() final; 66 void setPrivateClickMeasurementAppBundleIDForTesting(ApplicationBundleIdentifier&&); 64 67 void destroyStoreForTesting(CompletionHandler<void()>&&) final; 65 68 void allowTLSCertificateChainForLocalPCMTesting(const WebCore::CertificateInfo&) final; … … 73 76 void insertPrivateClickMeasurement(PrivateClickMeasurement&&, PrivateClickMeasurementAttributionType); 74 77 void clearSentAttribution(PrivateClickMeasurement&&, PrivateClickMeasurement::AttributionReportEndpoint); 75 void attribute(const SourceSite&, const AttributionDestinationSite&, AttributionTriggerData&& );78 void attribute(const SourceSite&, const AttributionDestinationSite&, AttributionTriggerData&&, const ApplicationBundleIdentifier&); 76 79 void fireConversionRequest(const PrivateClickMeasurement&, PrivateClickMeasurement::AttributionReportEndpoint); 77 80 void fireConversionRequestImpl(const PrivateClickMeasurement&, PrivateClickMeasurement::AttributionReportEndpoint); … … 87 90 std::optional<URL> m_tokenPublicKeyURLForTesting; 88 91 std::optional<URL> m_tokenSignatureURLForTesting; 92 std::optional<ApplicationBundleIdentifier> m_privateClickMeasurementAppBundleIDForTesting; 89 93 mutable RefPtr<PCM::Store> m_store; 90 94 String m_storageDirectory; -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerInterface.cpp
r282368 r283316 52 52 53 53 FUNCTION(handleAttribution) 54 ARGUMENTS(PrivateClickMeasurementManager::AttributionTriggerData, URL, WebCore::RegistrableDomain, URL )54 ARGUMENTS(PrivateClickMeasurementManager::AttributionTriggerData, URL, WebCore::RegistrableDomain, URL, String) 55 55 END 56 56 … … 109 109 FUNCTION(startTimerImmediatelyForTesting) 110 110 ARGUMENTS() 111 END 112 113 FUNCTION(setPrivateClickMeasurementAppBundleIDForTesting) 114 ARGUMENTS(String) 111 115 END 112 116 … … 155 159 case MessageType::SetPCMFraudPreventionValuesForTesting: 156 160 case MessageType::StartTimerImmediatelyForTesting: 161 case MessageType::SetPrivateClickMeasurementAppBundleIDForTesting: 157 162 case MessageType::AllowTLSCertificateChainForLocalPCMTesting: 158 163 return false; … … 265 270 handlePCMMessage<MessageInfo::startTimerImmediatelyForTesting>(WTFMove(encodedMessage)); 266 271 break; 272 case PCM::MessageType::SetPrivateClickMeasurementAppBundleIDForTesting: 273 handlePCMMessage<MessageInfo::setPrivateClickMeasurementAppBundleIDForTesting>(WTFMove(encodedMessage)); 274 break; 267 275 case PCM::MessageType::DestroyStoreForTesting: 268 276 handlePCMMessageWithReply<MessageInfo::destroyStoreForTesting>(WTFMove(encodedMessage), WTFMove(replySender)); -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerInterface.h
r282368 r283316 51 51 using RegistrableDomain = WebCore::RegistrableDomain; 52 52 using SourceSite = WebCore::PrivateClickMeasurement::SourceSite; 53 using ApplicationBundleIdentifier = String; 53 54 54 55 virtual void storeUnattributed(PrivateClickMeasurement&&) = 0; 55 virtual void handleAttribution(AttributionTriggerData&&, const URL& requestURL, WebCore::RegistrableDomain&& redirectDomain, const URL& firstPartyURL ) = 0;56 virtual void handleAttribution(AttributionTriggerData&&, const URL& requestURL, WebCore::RegistrableDomain&& redirectDomain, const URL& firstPartyURL, const ApplicationBundleIdentifier&) = 0; 56 57 virtual void clear(CompletionHandler<void()>&&) = 0; 57 58 virtual void clearForRegistrableDomain(const RegistrableDomain&, CompletionHandler<void()>&&) = 0; … … 68 69 virtual void setPCMFraudPreventionValuesForTesting(String&& unlinkableToken, String&& secretToken, String&& signature, String&& keyID) = 0; 69 70 virtual void startTimerImmediatelyForTesting() = 0; 71 virtual void setPrivateClickMeasurementAppBundleIDForTesting(ApplicationBundleIdentifier&&) = 0; 70 72 virtual void destroyStoreForTesting(CompletionHandler<void()>&&) = 0; 71 73 virtual void allowTLSCertificateChainForLocalPCMTesting(const WebCore::CertificateInfo&) = 0; … … 92 94 SetPCMFraudPreventionValuesForTesting, 93 95 StartTimerImmediatelyForTesting, 96 SetPrivateClickMeasurementAppBundleIDForTesting, 94 97 DestroyStoreForTesting, 95 98 AllowTLSCertificateChainForLocalPCMTesting … … 128 131 WebKit::PCM::MessageType::SetPCMFraudPreventionValuesForTesting, 129 132 WebKit::PCM::MessageType::StartTimerImmediatelyForTesting, 133 WebKit::PCM::MessageType::SetPrivateClickMeasurementAppBundleIDForTesting, 130 134 WebKit::PCM::MessageType::DestroyStoreForTesting, 131 135 WebKit::PCM::MessageType::AllowTLSCertificateChainForLocalPCMTesting -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerProxy.cpp
r282430 r283316 81 81 } 82 82 83 void ManagerProxy::handleAttribution(WebCore::PrivateClickMeasurement::AttributionTriggerData&& triggerData, const URL& requestURL, WebCore::RegistrableDomain&& redirectDomain, const URL& firstPartyURL )83 void ManagerProxy::handleAttribution(WebCore::PrivateClickMeasurement::AttributionTriggerData&& triggerData, const URL& requestURL, WebCore::RegistrableDomain&& redirectDomain, const URL& firstPartyURL, const ApplicationBundleIdentifier& applicationBundleIdentifier) 84 84 { 85 sendMessage<MessageType::HandleAttribution>(triggerData, requestURL, redirectDomain, firstPartyURL );85 sendMessage<MessageType::HandleAttribution>(triggerData, requestURL, redirectDomain, firstPartyURL, applicationBundleIdentifier); 86 86 } 87 87 … … 151 151 } 152 152 153 void ManagerProxy::setPrivateClickMeasurementAppBundleIDForTesting(ApplicationBundleIdentifier&& appBundleID) 154 { 155 sendMessage<MessageType::SetPrivateClickMeasurementAppBundleIDForTesting>(appBundleID); 156 } 157 153 158 void ManagerProxy::destroyStoreForTesting(CompletionHandler<void()>&& completionHandler) 154 159 { -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerProxy.h
r282368 r283316 40 40 ManagerProxy(const String& machServiceName); 41 41 42 using ApplicationBundleIdentifier = String; 43 42 44 void storeUnattributed(WebCore::PrivateClickMeasurement&&) final; 43 void handleAttribution(WebCore::PrivateClickMeasurement::AttributionTriggerData&&, const URL& requestURL, WebCore::RegistrableDomain&& redirectDomain, const URL& firstPartyURL ) final;45 void handleAttribution(WebCore::PrivateClickMeasurement::AttributionTriggerData&&, const URL& requestURL, WebCore::RegistrableDomain&& redirectDomain, const URL& firstPartyURL, const ApplicationBundleIdentifier&) final; 44 46 void clear(CompletionHandler<void()>&&) final; 45 47 void clearForRegistrableDomain(const WebCore::RegistrableDomain&, CompletionHandler<void()>&&) final; … … 56 58 void setPCMFraudPreventionValuesForTesting(String&& unlinkableToken, String&& secretToken, String&& signature, String&& keyID) final; 57 59 void startTimerImmediatelyForTesting() final; 60 void setPrivateClickMeasurementAppBundleIDForTesting(ApplicationBundleIdentifier&&) final; 58 61 void destroyStoreForTesting(CompletionHandler<void()>&&) final; 59 62 void allowTLSCertificateChainForLocalPCMTesting(const WebCore::CertificateInfo&) final; -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementStore.cpp
r282882 r283316 96 96 } 97 97 98 void Store::attributePrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite& sourceSite, const WebCore::PrivateClickMeasurement::AttributionDestinationSite& destinationSite, WebCore::PrivateClickMeasurement::AttributionTriggerData&& attributionTriggerData, std::optional<WebCore::PrivateClickMeasurement>&& ephemeralMeasurement, CompletionHandler<void(std::optional<WebCore::PrivateClickMeasurement::AttributionSecondsUntilSendData>&&, DebugInfo&&)>&& completionHandler)98 void Store::attributePrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite& sourceSite, const WebCore::PrivateClickMeasurement::AttributionDestinationSite& destinationSite, const ApplicationBundleIdentifier& applicationBundleIdentifier, WebCore::PrivateClickMeasurement::AttributionTriggerData&& attributionTriggerData, std::optional<WebCore::PrivateClickMeasurement>&& ephemeralMeasurement, CompletionHandler<void(std::optional<WebCore::PrivateClickMeasurement::AttributionSecondsUntilSendData>&&, DebugInfo&&)>&& completionHandler) 99 99 { 100 postTask([this, protectedThis = Ref { *this }, sourceSite = sourceSite.isolatedCopy(), destinationSite = destinationSite.isolatedCopy(), a ttributionTriggerData = WTFMove(attributionTriggerData), ephemeralMeasurement = crossThreadCopy(ephemeralMeasurement), completionHandler = WTFMove(completionHandler)] () mutable {100 postTask([this, protectedThis = Ref { *this }, sourceSite = sourceSite.isolatedCopy(), destinationSite = destinationSite.isolatedCopy(), applicationBundleIdentifier = applicationBundleIdentifier.isolatedCopy(), attributionTriggerData = WTFMove(attributionTriggerData), ephemeralMeasurement = crossThreadCopy(ephemeralMeasurement), completionHandler = WTFMove(completionHandler)] () mutable { 101 101 if (!m_database) { 102 102 return postTaskReply([completionHandler = WTFMove(completionHandler)] () mutable { … … 111 111 } 112 112 113 auto [seconds, debugInfo] = m_database->attributePrivateClickMeasurement(sourceSite, destinationSite, WTFMove(attributionTriggerData));113 auto [seconds, debugInfo] = m_database->attributePrivateClickMeasurement(sourceSite, destinationSite, applicationBundleIdentifier, WTFMove(attributionTriggerData)); 114 114 115 115 postTaskReply([seconds = WTFMove(seconds), debugInfo = debugInfo.isolatedCopy(), completionHandler = WTFMove(completionHandler)]() mutable { -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementStore.h
r281886 r283316 48 48 ~Store(); 49 49 50 using ApplicationBundleIdentifier = String; 51 50 52 static void prepareForProcessToSuspend(CompletionHandler<void()>&&); 51 53 static void processDidResume(); 52 54 53 55 void insertPrivateClickMeasurement(WebCore::PrivateClickMeasurement&&, WebKit::PrivateClickMeasurementAttributionType); 54 void attributePrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite&, const WebCore::PrivateClickMeasurement::AttributionDestinationSite&, WebCore::PrivateClickMeasurement::AttributionTriggerData&&, std::optional<WebCore::PrivateClickMeasurement>&& ephemeralMeasurement, CompletionHandler<void(std::optional<WebCore::PrivateClickMeasurement::AttributionSecondsUntilSendData>&&, DebugInfo&&)>&&);56 void attributePrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite&, const WebCore::PrivateClickMeasurement::AttributionDestinationSite&, const ApplicationBundleIdentifier&, WebCore::PrivateClickMeasurement::AttributionTriggerData&&, std::optional<WebCore::PrivateClickMeasurement>&& ephemeralMeasurement, CompletionHandler<void(std::optional<WebCore::PrivateClickMeasurement::AttributionSecondsUntilSendData>&&, DebugInfo&&)>&&); 55 57 56 58 void privateClickMeasurementToStringForTesting(CompletionHandler<void(String)>&&) const; -
trunk/Source/WebKit/UIProcess/API/C/WKPage.cpp
r283033 r283316 3139 3139 } 3140 3140 3141 void WKPageSetPrivateClickMeasurementAppBundleIDForTesting(WKPageRef pageRef, WKStringRef appBundleIDForTesting, WKPageSetPrivateClickMeasurementAppBundleIDForTestingFunction callback, void* callbackContext) 3142 { 3143 CRASH_IF_SUSPENDED; 3144 toImpl(pageRef)->setPrivateClickMeasurementAppBundleIDForTesting(toWTFString(appBundleIDForTesting), [callbackContext, callback] () { 3145 callback(callbackContext); 3146 }); 3147 } 3148 3141 3149 void WKPageSetMockCameraOrientation(WKPageRef pageRef, uint64_t orientation) 3142 3150 { -
trunk/Source/WebKit/UIProcess/API/C/WKPagePrivate.h
r283033 r283316 193 193 typedef void (*WKPageSetPCMFraudPreventionValuesForTestingFunction)(void* functionContext); 194 194 WK_EXPORT void WKPageSetPCMFraudPreventionValuesForTesting(WKPageRef page, WKStringRef secretToken, WKStringRef unlinkableToken, WKStringRef signature, WKStringRef keyID, WKPageSetPCMFraudPreventionValuesForTestingFunction callback, void* callbackContext); 195 typedef void (*WKPageSetPrivateClickMeasurementAppBundleIDForTestingFunction)(void* functionContext); 196 WK_EXPORT void WKPageSetPrivateClickMeasurementAppBundleIDForTesting(WKPageRef pageRef, WKStringRef appBundleIDForTesting, WKPageSetPrivateClickMeasurementAppBundleIDForTestingFunction callback, void* callbackContext); 195 197 196 198 WK_EXPORT void WKPageSetMockCameraOrientation(WKPageRef page, uint64_t orientation); -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h
r282884 r283316 104 104 - (void)_setPrivateClickMeasurementAttributionTokenPublicKeyURLForTesting:(NSURL *)url completionHandler:(void(^)(void))completionHandler WK_API_AVAILABLE(macos(12.0), ios(15.0)); 105 105 - (void)_setPrivateClickMeasurementAttributionTokenSignatureURLForTesting:(NSURL *)url completionHandler:(void(^)(void))completionHandler WK_API_AVAILABLE(macos(12.0), ios(15.0)); 106 - (void)_setPrivateClickMeasurementAppBundleIDForTesting:(NSString *)appBundleID completionHandler:(void(^)(void))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 106 107 - (void)_dumpPrivateClickMeasurement:(void(^)(NSString *))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 107 108 -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm
r283313 r283316 355 355 } 356 356 357 - (void)_setPrivateClickMeasurementAppBundleIDForTesting:(NSString *)appBundleID completionHandler:(void(^)(void))completionHandler 358 { 359 _page->setPrivateClickMeasurementAppBundleIDForTesting(appBundleID, [completionHandler = makeBlockPtr(completionHandler)] { 360 completionHandler(); 361 }); 362 } 363 357 364 - (void)_dumpPrivateClickMeasurement:(void(^)(NSString *))completionHandler 358 365 { -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r283313 r283316 10514 10514 } 10515 10515 10516 void WebPageProxy::setPrivateClickMeasurementAppBundleIDForTesting(const String& appBundleIDForTesting, CompletionHandler<void()>&& completionHandler) 10517 { 10518 websiteDataStore().networkProcess().sendWithAsyncReply(Messages::NetworkProcess::SetPrivateClickMeasurementAppBundleIDForTesting(m_websiteDataStore->sessionID(), appBundleIDForTesting), WTFMove(completionHandler)); 10519 } 10520 10516 10521 #if ENABLE(SPEECH_SYNTHESIS) 10517 10522 -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r283313 r283316 1778 1778 void markPrivateClickMeasurementsAsExpiredForTesting(CompletionHandler<void()>&&); 1779 1779 void setPCMFraudPreventionValuesForTesting(const String& unlinkableToken, const String& secretToken, const String& signature, const String& keyID, CompletionHandler<void()>&&); 1780 void setPrivateClickMeasurementAppBundleIDForTesting(const String& appBundleIDForTesting, CompletionHandler<void()>&&); 1780 1781 1781 1782 #if ENABLE(SPEECH_SYNTHESIS) -
trunk/Tools/ChangeLog
r283313 r283316 1 2021-09-30 John Wilander <wilander@apple.com> 2 3 PCM: Take app bundle ID into consideration when matching triggering events with pending clicks 4 https://bugs.webkit.org/show_bug.cgi?id=230778 5 <rdar://problem/83516528> 6 7 Reviewed by Alex Christensen. 8 9 https://commits.webkit.org/r282884 added app bundle IDs to unattributed 10 and attributed clicks in PCM. This patch makes sure we take those IDs 11 into consideration in PCM::Database::attributePrivateClickMeasurement(). 12 13 The TestRunner changes are all test infrastructure to enable different 14 app bundle IDs in the eyes of PCM. The API test changes are to make use 15 of the app bundle ID test infrastructure. 16 17 * TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm: 18 (TestWebKitAPI::runBasicEventAttributionTest): 19 (TestWebKitAPI::TEST): 20 * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl: 21 * WebKitTestRunner/InjectedBundle/TestRunner.cpp: 22 (WTR::TestRunner::setPrivateClickMeasurementAppBundleIDForTesting): 23 * WebKitTestRunner/InjectedBundle/TestRunner.h: 24 * WebKitTestRunner/TestController.cpp: 25 (WTR::TestController::setPrivateClickMeasurementAppBundleIDForTesting): 26 * WebKitTestRunner/TestController.h: 27 * WebKitTestRunner/TestInvocation.cpp: 28 (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle): 29 1 30 2021-09-30 Alex Christensen <achristensen@webkit.org> 2 31 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm
r283313 r283316 154 154 [webView _setPrivateClickMeasurementAttributionReportURLsForTesting:serverURL destinationURL:exampleURL() completionHandler:^{ 155 155 [webView _setPrivateClickMeasurementOverrideTimerForTesting:YES completionHandler:^{ 156 NSString *html = [NSString stringWithFormat:@"<script>fetch('%@conversionRequestBeforeRedirect',{mode:'no-cors'})</script>", serverURL]; 157 [webView loadHTMLString:html baseURL:exampleURL()]; 156 [webView _setPrivateClickMeasurementAppBundleIDForTesting:@"test.bundle.id" completionHandler:^{ 157 NSString *html = [NSString stringWithFormat:@"<script>fetch('%@conversionRequestBeforeRedirect',{mode:'no-cors'})</script>", serverURL]; 158 [webView loadHTMLString:html baseURL:exampleURL()]; 159 }]; 158 160 }]; 159 161 }]; -
trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl
r283114 r283316 417 417 undefined markPrivateClickMeasurementsAsExpiredForTesting(); 418 418 undefined setPrivateClickMeasurementFraudPreventionValuesForTesting(DOMString unlinkableToken, DOMString secretToken, DOMString signature, DOMString keyID); 419 undefined setPrivateClickMeasurementAppBundleIDForTesting(DOMString appBundleID); 419 420 420 421 // SpeechRecognition -
trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp
r283114 r283316 2115 2115 } 2116 2116 2117 void TestRunner::setPrivateClickMeasurementAppBundleIDForTesting(JSStringRef appBundleID) 2118 { 2119 postSynchronousPageMessage("SetPrivateClickMeasurementAppBundleIDForTesting", 2120 toWK(appBundleID)); 2121 } 2122 2117 2123 bool TestRunner::hasAppBoundSession() 2118 2124 { -
trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h
r283114 r283316 533 533 void setPrivateClickMeasurementEphemeralMeasurementForTesting(bool value); 534 534 void setPrivateClickMeasurementFraudPreventionValuesForTesting(JSStringRef unlinkableToken, JSStringRef secretToken, JSStringRef signature, JSStringRef keyID); 535 void setPrivateClickMeasurementAppBundleIDForTesting(JSStringRef); 535 536 void simulateResourceLoadStatisticsSessionRestart(); 536 537 -
trunk/Tools/WebKitTestRunner/TestController.cpp
r283114 r283316 3750 3750 } 3751 3751 3752 void TestController::setPrivateClickMeasurementAppBundleIDForTesting(WKStringRef appBundleID) 3753 { 3754 PrivateClickMeasurementVoidCallbackContext callbackContext(*this); 3755 WKPageSetPrivateClickMeasurementAppBundleIDForTesting(m_mainWebView->page(), appBundleID, privateClickMeasurementVoidCallback, &callbackContext); 3756 runUntil(callbackContext.done, noTimeout); 3757 } 3758 3752 3759 WKURLRef TestController::currentTestURL() const 3753 3760 { -
trunk/Tools/WebKitTestRunner/TestController.h
r283114 r283316 356 356 void markPrivateClickMeasurementsAsExpiredForTesting(); 357 357 void setPCMFraudPreventionValuesForTesting(WKStringRef unlinkableToken, WKStringRef secretToken, WKStringRef signature, WKStringRef keyID); 358 void setPrivateClickMeasurementAppBundleIDForTesting(WKStringRef); 358 359 359 360 void didSetAppBoundDomains() const; -
trunk/Tools/WebKitTestRunner/TestInvocation.cpp
r283114 r283316 1424 1424 } 1425 1425 1426 if (WKStringIsEqualToUTF8CString(messageName, "SetPrivateClickMeasurementAppBundleIDForTesting")) { 1427 TestController::singleton().setPrivateClickMeasurementAppBundleIDForTesting(stringValue(messageBody)); 1428 return nullptr; 1429 } 1430 1426 1431 if (WKStringIsEqualToUTF8CString(messageName, "SyncLocalStorage")) { 1427 1432 TestController::singleton().syncLocalStorage();
Note:
See TracChangeset
for help on using the changeset viewer.