⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 282884 in webkit


Ignore:
Timestamp:
Sep 22, 2021, 2:32:16 PM (5 years ago)
Author:
commit-queue@webkit.org
Message:

PCM should include the bundle ID of the app from which it originated
https://bugs.webkit.org/show_bug.cgi?id=230576
<rdar://83065221>

Patch by Alex Christensen <achristensen@webkit.org> on 2021-09-22
Reviewed by Kate Cheney.

Source/WebCore:

This adds infrastructure to store the bundle ID of the application.
In another patch I'm going to use that to prevent PCMs from one app from overwriting PCMs from another app during attribution.

  • html/HTMLAnchorElement.cpp:

(WebCore::HTMLAnchorElement::parsePrivateClickMeasurement const):

  • loader/PrivateClickMeasurement.cpp:

(WebCore::PrivateClickMeasurement::isolatedCopy const):

  • loader/PrivateClickMeasurement.h:

(WebCore::PrivateClickMeasurement::PrivateClickMeasurement):
(WebCore::PrivateClickMeasurement::attributionTriggerData const):
(WebCore::PrivateClickMeasurement::sourceApplicationBundleID const):
(WebCore::PrivateClickMeasurement::encode const):
(WebCore::PrivateClickMeasurement::decode):
(WebCore::PrivateClickMeasurement::attributionTriggerData): Deleted.

Source/WebKit:

  • NetworkProcess/DatabaseUtilities.cpp:

(WebKit::DatabaseUtilities::buildPrivateClickMeasurementFromDatabase const):
(WebKit::DatabaseUtilities::buildPrivateClickMeasurementFromDatabase): Deleted.

  • NetworkProcess/DatabaseUtilities.h:
  • NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.cpp:

(WebKit::PCM::Database::Database):
(WebKit::PCM::Database::insertPrivateClickMeasurement):
(WebKit::PCM::Database::privateClickMeasurementToStringForTesting const):
(WebKit::PCM::Database::attributionToStringForTesting const):
(WebKit::PCM::Database::addBundleIDColumnIfNecessary):
(WebKit::PCM::Database::columnsForTable):
(WebKit::PCM::Database::addMissingColumnToTable):

  • NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.h:
  • UIProcess/API/Cocoa/WKWebViewPrivate.h:
  • UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h:
  • UIProcess/API/Cocoa/WKWebViewTesting.mm:

(-[WKWebView _addEventAttributionWithSourceID:destinationURL:sourceDescription:purchaser:reportEndpoint:optionalNonce:applicationBundleID:]):
(-[WKWebView _addEventAttributionWithSourceID:destinationURL:sourceDescription:purchaser:reportEndpoint:optionalNonce:]): Deleted.

  • UIProcess/API/ios/WKWebViewIOS.mm:

(-[WKWebView _setEphemeralUIEventAttribution:]):
(-[WKWebView _setEphemeralUIEventAttribution:forApplicationWithBundleID:]):

Tools:

  • TestWebKitAPI/Tests/WebCore/PrivateClickMeasurement.cpp:

(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm:

(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/PrivateClickMeasurement.mm:

(pollUntilPCMIsMigrated):

LayoutTests:

  • http/tests/contentextensions/block-private-click-measurement-expected.txt:
  • http/tests/privateClickMeasurement/attribution-conversion-through-cross-site-image-redirect-expected.txt:
  • http/tests/privateClickMeasurement/attribution-conversion-through-fetch-keepalive-expected.txt:
  • http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-ephemeral-expected.txt:
  • http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-in-new-window-expected.txt:
  • http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-with-priority-expected.txt:
  • http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-without-priority-expected.txt:
  • http/tests/privateClickMeasurement/conversion-disabled-in-ephemeral-session-expected.txt:
  • http/tests/privateClickMeasurement/private-click-measurement-with-source-nonce-null-content-expected.txt:
  • http/tests/privateClickMeasurement/private-click-measurement-with-source-nonce-wrong-content-type-expected.txt:
  • http/tests/privateClickMeasurement/second-attribution-converted-with-higher-priority-expected.txt:
  • http/tests/privateClickMeasurement/second-attribution-converted-with-lower-priority-expected.txt:
  • http/tests/privateClickMeasurement/second-conversion-with-higher-priority-expected.txt:
  • http/tests/privateClickMeasurement/second-conversion-with-lower-priority-expected.txt:
  • http/tests/privateClickMeasurement/store-private-click-measurement-expected.txt:
Location:
trunk
Files:
2 added
33 edited
15 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r282880 r282884  
     12021-09-22  Alex Christensen  <achristensen@webkit.org>
     2
     3        PCM should include the bundle ID of the app from which it originated
     4        https://bugs.webkit.org/show_bug.cgi?id=230576
     5        <rdar://83065221>
     6
     7        Reviewed by Kate Cheney.
     8
     9        * http/tests/contentextensions/block-private-click-measurement-expected.txt:
     10        * http/tests/privateClickMeasurement/attribution-conversion-through-cross-site-image-redirect-expected.txt:
     11        * http/tests/privateClickMeasurement/attribution-conversion-through-fetch-keepalive-expected.txt:
     12        * http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-ephemeral-expected.txt:
     13        * http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-in-new-window-expected.txt:
     14        * http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-with-priority-expected.txt:
     15        * http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-without-priority-expected.txt:
     16        * http/tests/privateClickMeasurement/conversion-disabled-in-ephemeral-session-expected.txt:
     17        * http/tests/privateClickMeasurement/private-click-measurement-with-source-nonce-null-content-expected.txt:
     18        * http/tests/privateClickMeasurement/private-click-measurement-with-source-nonce-wrong-content-type-expected.txt:
     19        * http/tests/privateClickMeasurement/second-attribution-converted-with-higher-priority-expected.txt:
     20        * http/tests/privateClickMeasurement/second-attribution-converted-with-lower-priority-expected.txt:
     21        * http/tests/privateClickMeasurement/second-conversion-with-higher-priority-expected.txt:
     22        * http/tests/privateClickMeasurement/second-conversion-with-lower-priority-expected.txt:
     23        * http/tests/privateClickMeasurement/store-private-click-measurement-expected.txt:
     24
    1252021-09-22  Gabriel Nava Marino  <gnavamarino@apple.com>
    226
  • trunk/LayoutTests/http/tests/contentextensions/block-private-click-measurement-expected.txt

    r274801 r282884  
    1616Source ID: 3
    1717No attribution trigger data.
     18Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/attribution-conversion-through-cross-site-image-redirect-expected.txt

    r270136 r282884  
    88Source ID: 3
    99No attribution trigger data.
     10Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/attribution-conversion-through-fetch-keepalive-expected.txt

    r272422 r282884  
    1313Attribution priority: 0
    1414Attribution earliest time to send: Within 24-48 hours
     15Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-ephemeral-expected.txt

    r281480 r282884  
    1010Attribution priority: 0
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-in-new-window-expected.txt

    r270136 r282884  
    1010Attribution priority: 3
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-with-priority-expected.txt

    r270136 r282884  
    1010Attribution priority: 3
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-without-priority-expected.txt

    r270136 r282884  
    1010Attribution priority: 0
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/conversion-disabled-in-ephemeral-session-expected.txt

    r270136 r282884  
    1414Source ID: 3
    1515No attribution trigger data.
     16Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/private-click-measurement-with-source-nonce-null-content-expected.txt

    r275260 r282884  
    1414Source ID: 3
    1515No attribution trigger data.
     16Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/private-click-measurement-with-source-nonce-wrong-content-type-expected.txt

    r275260 r282884  
    1414Source ID: 3
    1515No attribution trigger data.
     16Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/second-attribution-converted-with-higher-priority-expected.txt

    r270136 r282884  
    1010Attribution priority: 4
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/second-attribution-converted-with-lower-priority-expected.txt

    r270136 r282884  
    1010Attribution priority: 4
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/second-conversion-with-higher-priority-expected.txt

    r270136 r282884  
    1010Attribution priority: 4
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/second-conversion-with-lower-priority-expected.txt

    r270136 r282884  
    1010Attribution priority: 4
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/http/tests/privateClickMeasurement/store-private-click-measurement-expected.txt

    r270136 r282884  
    88Source ID: 3
    99No attribution trigger data.
     10Application bundle identifier: com.apple.WebKit.WebKitTestRunner
  • trunk/LayoutTests/platform/ios/http/tests/contentextensions/block-private-click-measurement-expected.txt

    r282883 r282884  
    1616Source ID: 3
    1717No attribution trigger data.
     18Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/attribution-conversion-through-cross-site-image-redirect-expected.txt

    r282883 r282884  
    88Source ID: 3
    99No attribution trigger data.
     10Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/attribution-conversion-through-fetch-keepalive-expected.txt

    r282883 r282884  
    1313Attribution priority: 0
    1414Attribution earliest time to send: Within 24-48 hours
     15Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-ephemeral-expected.txt

    r282883 r282884  
    1010Attribution priority: 0
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-in-new-window-expected.txt

    r282883 r282884  
    1010Attribution priority: 3
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-with-priority-expected.txt

    r282883 r282884  
    1010Attribution priority: 3
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/attribution-conversion-through-image-redirect-without-priority-expected.txt

    r282883 r282884  
    1010Attribution priority: 0
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/conversion-disabled-in-ephemeral-session-expected.txt

    r282883 r282884  
    1414Source ID: 3
    1515No attribution trigger data.
     16Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/private-click-measurement-with-source-nonce-null-content-expected.txt

    r282883 r282884  
    1414Source ID: 3
    1515No attribution trigger data.
     16Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/private-click-measurement-with-source-nonce-wrong-content-type-expected.txt

    r282883 r282884  
    1414Source ID: 3
    1515No attribution trigger data.
     16Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/second-attribution-converted-with-higher-priority-expected.txt

    r282883 r282884  
    1010Attribution priority: 4
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/second-attribution-converted-with-lower-priority-expected.txt

    r282883 r282884  
    1010Attribution priority: 4
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/second-conversion-with-higher-priority-expected.txt

    r282883 r282884  
    1010Attribution priority: 4
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/second-conversion-with-lower-priority-expected.txt

    r282883 r282884  
    1010Attribution priority: 4
    1111Attribution earliest time to send: Within 24-48 hours
     12Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/LayoutTests/platform/ios/http/tests/privateClickMeasurement/store-private-click-measurement-expected.txt

    r282883 r282884  
    88Source ID: 3
    99No attribution trigger data.
     10Application bundle identifier: org.webkit.WebKitTestRunnerApp
  • trunk/Source/WebCore/ChangeLog

    r282882 r282884  
     12021-09-22  Alex Christensen  <achristensen@webkit.org>
     2
     3        PCM should include the bundle ID of the app from which it originated
     4        https://bugs.webkit.org/show_bug.cgi?id=230576
     5        <rdar://83065221>
     6
     7        Reviewed by Kate Cheney.
     8
     9        This adds infrastructure to store the bundle ID of the application.
     10        In another patch I'm going to use that to prevent PCMs from one app from overwriting PCMs from another app during attribution.
     11
     12        * html/HTMLAnchorElement.cpp:
     13        (WebCore::HTMLAnchorElement::parsePrivateClickMeasurement const):
     14        * loader/PrivateClickMeasurement.cpp:
     15        (WebCore::PrivateClickMeasurement::isolatedCopy const):
     16        * loader/PrivateClickMeasurement.h:
     17        (WebCore::PrivateClickMeasurement::PrivateClickMeasurement):
     18        (WebCore::PrivateClickMeasurement::attributionTriggerData const):
     19        (WebCore::PrivateClickMeasurement::sourceApplicationBundleID const):
     20        (WebCore::PrivateClickMeasurement::encode const):
     21        (WebCore::PrivateClickMeasurement::decode):
     22        (WebCore::PrivateClickMeasurement::attributionTriggerData): Deleted.
     23
    1242021-09-22  Chris Dumez  <cdumez@apple.com>
    225
  • trunk/Source/WebCore/html/HTMLAnchorElement.cpp

    r281239 r282884  
    4848#include "RenderImage.h"
    4949#include "ResourceRequest.h"
     50#include "RuntimeApplicationChecks.h"
    5051#include "RuntimeEnabledFeatures.h"
    5152#include "SVGImage.h"
     
    450451    }
    451452
    452     auto privateClickMeasurement = PrivateClickMeasurement { SourceID(attributionSourceID.value()), SourceSite(WTFMove(documentRegistrableDomain)), AttributionDestinationSite(destinationURL) };
     453#if PLATFORM(COCOA)
     454    auto bundleID = applicationBundleIdentifier();
     455#else
     456    String bundleID;
     457#endif
     458    auto privateClickMeasurement = PrivateClickMeasurement { SourceID(attributionSourceID.value()), SourceSite(WTFMove(documentRegistrableDomain)), AttributionDestinationSite(destinationURL), bundleID };
    453459
    454460    auto attributionSourceNonceAttr = attributeWithoutSynchronization(attributionsourcenonceAttr);
  • trunk/Source/WebCore/loader/PrivateClickMeasurement.cpp

    r281837 r282884  
    102102    copy.m_sourceUnlinkableToken = m_sourceUnlinkableToken.isolatedCopy();
    103103    copy.m_sourceSecretToken = crossThreadCopy(m_sourceSecretToken);
     104    copy.m_sourceApplicationBundleID = m_sourceApplicationBundleID.isolatedCopy();
    104105    return copy;
    105106}
  • trunk/Source/WebCore/loader/PrivateClickMeasurement.h

    r281721 r282884  
    313313
    314314    PrivateClickMeasurement() = default;
    315     PrivateClickMeasurement(SourceID sourceID, const SourceSite& sourceSite, const AttributionDestinationSite& destinationSite, String&& sourceDescription = { }, String&& purchaser = { }, WallTime timeOfAdClick = WallTime::now(), PrivateClickMeasurementAttributionEphemeral isEphemeral = PrivateClickMeasurementAttributionEphemeral::No)
     315    PrivateClickMeasurement(SourceID sourceID, const SourceSite& sourceSite, const AttributionDestinationSite& destinationSite, const String& sourceApplicationBundleID, String&& sourceDescription = { }, String&& purchaser = { }, WallTime timeOfAdClick = WallTime::now(), PrivateClickMeasurementAttributionEphemeral isEphemeral = PrivateClickMeasurementAttributionEphemeral::No)
    316316        : m_sourceID { sourceID }
    317317        , m_sourceSite { sourceSite }
     
    321321        , m_timeOfAdClick { timeOfAdClick }
    322322        , m_isEphemeral { isEphemeral }
     323        , m_sourceApplicationBundleID { sourceApplicationBundleID }
    323324    {
    324325    }
     
    338339    void setTimesToSend(AttributionTimeToSendData data) { m_timesToSend = data; }
    339340    const SourceID& sourceID() const { return m_sourceID; }
    340     std::optional<AttributionTriggerData> attributionTriggerData() { return m_attributionTriggerData; }
     341    const std::optional<AttributionTriggerData>& attributionTriggerData() const { return m_attributionTriggerData; }
    341342    void setAttribution(AttributionTriggerData&& attributionTriggerData) { m_attributionTriggerData = WTFMove(attributionTriggerData); }
     343    const String& sourceApplicationBundleID() const { return m_sourceApplicationBundleID; }
    342344
    343345    const String& sourceDescription() const { return m_sourceDescription; }
     
    418420    SourceUnlinkableToken m_sourceUnlinkableToken;
    419421    std::optional<SourceSecretToken> m_sourceSecretToken;
     422    String m_sourceApplicationBundleID;
    420423};
    421424
     
    432435        << m_isEphemeral
    433436        << m_attributionTriggerData
     437        << m_sourceApplicationBundleID
    434438        << m_timesToSend;
    435439}
     
    482486    if (!attributionTriggerData)
    483487        return std::nullopt;
    484    
     488
     489    std::optional<String> sourceApplicationBundleID;
     490    decoder >> sourceApplicationBundleID;
     491    if (!sourceApplicationBundleID)
     492        return std::nullopt;
     493
    485494    std::optional<AttributionTimeToSendData> timesToSend;
    486495    decoder >> timesToSend;
     
    492501        SourceSite { WTFMove(*sourceRegistrableDomain) },
    493502        AttributionDestinationSite { WTFMove(*destinationRegistrableDomain) },
     503        WTFMove(*sourceApplicationBundleID),
    494504        WTFMove(*sourceDescription),
    495505        WTFMove(*purchaser),
  • trunk/Source/WebKit/ChangeLog

    r282883 r282884  
     12021-09-22  Alex Christensen  <achristensen@webkit.org>
     2
     3        PCM should include the bundle ID of the app from which it originated
     4        https://bugs.webkit.org/show_bug.cgi?id=230576
     5        <rdar://83065221>
     6
     7        Reviewed by Kate Cheney.
     8
     9        * NetworkProcess/DatabaseUtilities.cpp:
     10        (WebKit::DatabaseUtilities::buildPrivateClickMeasurementFromDatabase const):
     11        (WebKit::DatabaseUtilities::buildPrivateClickMeasurementFromDatabase): Deleted.
     12        * NetworkProcess/DatabaseUtilities.h:
     13        * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.cpp:
     14        (WebKit::PCM::Database::Database):
     15        (WebKit::PCM::Database::insertPrivateClickMeasurement):
     16        (WebKit::PCM::Database::privateClickMeasurementToStringForTesting const):
     17        (WebKit::PCM::Database::attributionToStringForTesting const):
     18        (WebKit::PCM::Database::addBundleIDColumnIfNecessary):
     19        (WebKit::PCM::Database::columnsForTable):
     20        (WebKit::PCM::Database::addMissingColumnToTable):
     21        * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.h:
     22        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
     23        * UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h:
     24        * UIProcess/API/Cocoa/WKWebViewTesting.mm:
     25        (-[WKWebView _addEventAttributionWithSourceID:destinationURL:sourceDescription:purchaser:reportEndpoint:optionalNonce:applicationBundleID:]):
     26        (-[WKWebView _addEventAttributionWithSourceID:destinationURL:sourceDescription:purchaser:reportEndpoint:optionalNonce:]): Deleted.
     27        * UIProcess/API/ios/WKWebViewIOS.mm:
     28        (-[WKWebView _setEphemeralUIEventAttribution:]):
     29        (-[WKWebView _setEphemeralUIEventAttribution:forApplicationWithBundleID:]):
     30
    1312021-09-22  Alex Christensen  <achristensen@webkit.org>
    232
  • trunk/Source/WebKit/NetworkProcess/DatabaseUtilities.cpp

    r281779 r282884  
    138138}
    139139
    140 WebCore::PrivateClickMeasurement DatabaseUtilities::buildPrivateClickMeasurementFromDatabase(WebCore::SQLiteStatement& statement, PrivateClickMeasurementAttributionType attributionType)
     140WebCore::PrivateClickMeasurement DatabaseUtilities::buildPrivateClickMeasurementFromDatabase(WebCore::SQLiteStatement& statement, PrivateClickMeasurementAttributionType attributionType) const
    141141{
    142142    ASSERT(!RunLoop::isMain());
     
    148148    auto signature = attributionType == PrivateClickMeasurementAttributionType::Attributed ? statement.columnText(8) : statement.columnText(5);
    149149    auto keyID = attributionType == PrivateClickMeasurementAttributionType::Attributed ? statement.columnText(9) : statement.columnText(6);
     150    auto bundleID = attributionType == PrivateClickMeasurementAttributionType::Attributed ? statement.columnText(11) : statement.columnText(7);
    150151
    151     WebCore::PrivateClickMeasurement attribution(WebCore::PrivateClickMeasurement::SourceID(sourceID), WebCore::PrivateClickMeasurement::SourceSite(WebCore::RegistrableDomain::uncheckedCreateFromRegistrableDomainString(sourceSiteDomain)), WebCore::PrivateClickMeasurement::AttributionDestinationSite(WebCore::RegistrableDomain::uncheckedCreateFromRegistrableDomainString(destinationSiteDomain)), { }, { }, WallTime::fromRawSeconds(timeOfAdClick));
     152    // Safari was the only application that used PCM when it was stored with ResourceLoadStatistics.
     153#if PLATFORM(MAC)
     154    constexpr auto safariBundleID = "com.apple.Safari"_s;
     155#else
     156    constexpr auto safariBundleID = "com.apple.mobilesafari"_s;
     157#endif
     158    if (bundleID.isEmpty())
     159        bundleID = safariBundleID;
     160
     161    WebCore::PrivateClickMeasurement attribution(WebCore::PrivateClickMeasurement::SourceID(sourceID), WebCore::PrivateClickMeasurement::SourceSite(WebCore::RegistrableDomain::uncheckedCreateFromRegistrableDomainString(sourceSiteDomain)), WebCore::PrivateClickMeasurement::AttributionDestinationSite(WebCore::RegistrableDomain::uncheckedCreateFromRegistrableDomainString(destinationSiteDomain)), bundleID, { }, { }, WallTime::fromRawSeconds(timeOfAdClick));
    152162
    153163    if (attributionType == PrivateClickMeasurementAttributionType::Attributed) {
  • trunk/Source/WebKit/NetworkProcess/DatabaseUtilities.h

    r281779 r282884  
    5656    virtual String getDomainStringFromDomainID(unsigned) const = 0;
    5757
    58     WebCore::PrivateClickMeasurement buildPrivateClickMeasurementFromDatabase(WebCore::SQLiteStatement&, PrivateClickMeasurementAttributionType);
     58    WebCore::PrivateClickMeasurement buildPrivateClickMeasurementFromDatabase(WebCore::SQLiteStatement&, PrivateClickMeasurementAttributionType) const;
    5959
    6060    const String m_storageFilePath;
  • trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.cpp

    r281886 r282884  
    4141constexpr auto setUnattributedPrivateClickMeasurementAsExpiredQuery = "UPDATE UnattributedPrivateClickMeasurement SET timeOfAdClick = -1.0"_s;
    4242constexpr auto insertUnattributedPrivateClickMeasurementQuery = "INSERT OR REPLACE INTO UnattributedPrivateClickMeasurement (sourceSiteDomainID, destinationSiteDomainID, "
    43     "sourceID, timeOfAdClick, token, signature, keyID) VALUES (?, ?, ?, ?, ?, ?, ?)"_s;
     43    "sourceID, timeOfAdClick, token, signature, keyID, sourceApplicationBundleID) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"_s;
    4444constexpr auto insertAttributedPrivateClickMeasurementQuery = "INSERT OR REPLACE INTO AttributedPrivateClickMeasurement (sourceSiteDomainID, destinationSiteDomainID, "
    45     "sourceID, attributionTriggerData, priority, timeOfAdClick, earliestTimeToSendToSource, token, signature, keyID, earliestTimeToSendToDestination) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"_s;
     45    "sourceID, attributionTriggerData, priority, timeOfAdClick, earliestTimeToSendToSource, token, signature, keyID, earliestTimeToSendToDestination, sourceApplicationBundleID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"_s;
    4646constexpr auto findUnattributedQuery = "SELECT * FROM UnattributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ?"_s;
    4747constexpr auto findAttributedQuery = "SELECT * FROM AttributedPrivateClickMeasurement WHERE sourceSiteDomainID = ? AND destinationSiteDomainID = ?"_s;
     
    6060constexpr auto createUnattributedPrivateClickMeasurement = "CREATE TABLE UnattributedPrivateClickMeasurement ("
    6161    "sourceSiteDomainID INTEGER NOT NULL, destinationSiteDomainID INTEGER NOT NULL, sourceID INTEGER NOT NULL, "
    62     "timeOfAdClick REAL NOT NULL, token TEXT, signature TEXT, keyID TEXT, FOREIGN KEY(sourceSiteDomainID) "
     62    "timeOfAdClick REAL NOT NULL, token TEXT, signature TEXT, keyID TEXT, sourceApplicationBundleID TEXT, FOREIGN KEY(sourceSiteDomainID) "
    6363    "REFERENCES PCMObservedDomains(domainID) ON DELETE CASCADE, FOREIGN KEY(destinationSiteDomainID) REFERENCES "
    6464    "PCMObservedDomains(domainID) ON DELETE CASCADE)"_s;
     
    6666    "sourceSiteDomainID INTEGER NOT NULL, destinationSiteDomainID INTEGER NOT NULL, sourceID INTEGER NOT NULL, "
    6767    "attributionTriggerData INTEGER NOT NULL, priority INTEGER NOT NULL, timeOfAdClick REAL NOT NULL, "
    68     "earliestTimeToSendToSource REAL, token TEXT, signature TEXT, keyID TEXT, earliestTimeToSendToDestination REAL, "
     68    "earliestTimeToSendToSource REAL, token TEXT, signature TEXT, keyID TEXT, earliestTimeToSendToDestination REAL, sourceApplicationBundleID TEXT, "
    6969    "FOREIGN KEY(sourceSiteDomainID) REFERENCES PCMObservedDomains(domainID) ON DELETE CASCADE, FOREIGN KEY(destinationSiteDomainID) REFERENCES "
    7070    "PCMObservedDomains(domainID) ON DELETE CASCADE)"_s;
     
    8989    openDatabaseAndCreateSchemaIfNecessary();
    9090    enableForeignKeys();
     91    addBundleIDColumnIfNecessary();
    9192    allDatabases().add(this);
    9293}
     
    167168            || statement->bindText(10, sourceUnlinkableToken ? sourceUnlinkableToken->keyIDBase64URL : emptyString()) != SQLITE_OK
    168169            || statement->bindDouble(11, destinationEarliestTimeToSend) != SQLITE_OK
     170            || statement->bindText(12, attribution.sourceApplicationBundleID()) != SQLITE_OK
    169171            || statement->step() != SQLITE_DONE) {
    170172            RELEASE_LOG_ERROR(PrivateClickMeasurement, "%p - Database::insertPrivateClickMeasurement insertAttributedPrivateClickMeasurementQuery, error message: %" PRIVATE_LOG_STRING, this, m_database.lastErrorMsg());
     
    185187        || statement->bindText(6, sourceUnlinkableToken ? sourceUnlinkableToken->signatureBase64URL : emptyString()) != SQLITE_OK
    186188        || statement->bindText(7, sourceUnlinkableToken ? sourceUnlinkableToken->keyIDBase64URL : emptyString()) != SQLITE_OK
     189        || statement->bindText(8, attribution.sourceApplicationBundleID()) != SQLITE_OK
    187190        || statement->step() != SQLITE_DONE) {
    188191        RELEASE_LOG_ERROR(PrivateClickMeasurement, "%p - Database::insertPrivateClickMeasurement insertUnattributedPrivateClickMeasurementQuery, error message: %" PRIVATE_LOG_STRING, this, m_database.lastErrorMsg());
     
    365368        const char* prefix = unattributedNumber ? "" : "Unattributed Private Click Measurements:";
    366369        builder.append(prefix, "\nWebCore::PrivateClickMeasurement ", ++unattributedNumber, '\n',
    367             attributionToStringForTesting(*unattributedScopedStatement.get(), PrivateClickMeasurementAttributionType::Unattributed));
     370            attributionToStringForTesting(buildPrivateClickMeasurementFromDatabase(*unattributedScopedStatement.get(), PrivateClickMeasurementAttributionType::Unattributed)));
    368371    }
    369372
     
    381384            builder.append(unattributedNumber ? "\n" : "", "Attributed Private Click Measurements:");
    382385        builder.append("\nWebCore::PrivateClickMeasurement ", ++attributedNumber + unattributedNumber, '\n',
    383             attributionToStringForTesting(*attributedScopedStatement.get(), PrivateClickMeasurementAttributionType::Attributed));
     386            attributionToStringForTesting(buildPrivateClickMeasurementFromDatabase(*attributedScopedStatement.get(), PrivateClickMeasurementAttributionType::Attributed)));
    384387    }
    385388    return builder.toString();
    386389}
    387390
    388 String Database::attributionToStringForTesting(WebCore::SQLiteStatement& statement, PrivateClickMeasurementAttributionType attributionType) const
    389 {
    390     ASSERT(!RunLoop::isMain());
    391     auto sourceSiteDomain = getDomainStringFromDomainID(statement.columnInt(0));
    392     auto destinationSiteDomain = getDomainStringFromDomainID(statement.columnInt(1));
    393     auto sourceID = statement.columnInt(2);
     391String Database::attributionToStringForTesting(const WebCore::PrivateClickMeasurement& pcm) const
     392{
     393    ASSERT(!RunLoop::isMain());
     394    auto sourceSiteDomain = pcm.sourceSite().registrableDomain;
     395    auto destinationSiteDomain = pcm.destinationSite().registrableDomain;
     396    auto sourceID = pcm.sourceID().id;
    394397
    395398    StringBuilder builder;
    396399    builder.append("Source site: ", sourceSiteDomain, "\nAttribute on site: ", destinationSiteDomain, "\nSource ID: ", sourceID);
    397400
    398     if (attributionType == PrivateClickMeasurementAttributionType::Attributed) {
    399         auto attributionTriggerData = statement.columnInt(3);
    400         auto priority = statement.columnInt(4);
    401         auto earliestTimeToSend = statement.columnInt(6);
    402 
    403         if (attributionTriggerData != -1) {
    404             builder.append("\nAttribution trigger data: ", attributionTriggerData, "\nAttribution priority: ", priority, "\nAttribution earliest time to send: ");
    405             if (earliestTimeToSend == -1)
    406                 builder.append("Not set");
    407             else {
    408                 auto secondsUntilSend = WallTime::fromRawSeconds(earliestTimeToSend) - WallTime::now();
    409                 builder.append((secondsUntilSend >= 24_h && secondsUntilSend <= 48_h) ? "Within 24-48 hours" : "Outside 24-48 hours");
    410             }
    411         } else
    412             builder.append("\nNo attribution trigger data.");
     401    if (auto& triggerData = pcm.attributionTriggerData()) {
     402        auto attributionTriggerData = triggerData->data;
     403        auto priority = triggerData->priority;
     404        auto earliestTimeToSend = pcm.timesToSend().sourceEarliestTimeToSend;
     405
     406        builder.append("\nAttribution trigger data: ", attributionTriggerData, "\nAttribution priority: ", priority, "\nAttribution earliest time to send: ");
     407        if (!earliestTimeToSend)
     408            builder.append("Not set");
     409        else {
     410            auto secondsUntilSend = *earliestTimeToSend - WallTime::now();
     411            builder.append((secondsUntilSend >= 24_h && secondsUntilSend <= 48_h) ? "Within 24-48 hours" : "Outside 24-48 hours");
     412        }
    413413    } else
    414414        builder.append("\nNo attribution trigger data.");
    415     builder.append('\n');
     415    builder.append("\nApplication bundle identifier: ", pcm.sourceApplicationBundleID(), '\n');
    416416
    417417    return builder.toString();
     
    661661}
    662662
     663void Database::addBundleIDColumnIfNecessary()
     664{
     665    // FIXME: Remove this at the end of 2021. No public release was made with the schema missing sourceApplicationBundleID, so this is only needed to migrate internal users who updated in September 2021.
     666    String attributedTableName("AttributedPrivateClickMeasurement");
     667    String unattributedTableName("UnattributedPrivateClickMeasurement"_s);
     668    String sourceApplicationBundleIDColumnName("sourceApplicationBundleID"_s);
     669    auto checkColumns = [&] (const String& tableName) {
     670        auto columns = columnsForTable(tableName);
     671        if (!columns.size() || columns.last() != sourceApplicationBundleIDColumnName)
     672            addMissingColumnToTable(tableName, sourceApplicationBundleIDColumnName);
     673    };
     674    checkColumns(attributedTableName);
     675    checkColumns(unattributedTableName);
     676}
     677
     678Vector<String> Database::columnsForTable(const String& tableName)
     679{
     680    auto statement = m_database.prepareStatementSlow(makeString("PRAGMA table_info(", tableName, ")"));
     681
     682    if (!statement) {
     683        RELEASE_LOG_ERROR(PrivateClickMeasurement, "%p - Database::columnsForTable Unable to prepare statement to fetch schema for table, error message: %" PRIVATE_LOG_STRING, this, m_database.lastErrorMsg());
     684        ASSERT_NOT_REACHED();
     685        return { };
     686    }
     687
     688    Vector<String> columns;
     689    while (statement->step() == SQLITE_ROW) {
     690        auto name = statement->columnText(1);
     691        columns.append(name);
     692    }
     693
     694    return columns;
     695}
     696
     697void Database::addMissingColumnToTable(const String& tableName, const String& columnName)
     698{
     699    auto statement = m_database.prepareStatementSlow(makeString("ALTER TABLE ", tableName, " ADD COLUMN ", columnName));
     700    if (!statement) {
     701        RELEASE_LOG_ERROR(PrivateClickMeasurement, "%p - Database::addMissingColumnToTable Unable to prepare statement to add missing columns to table, error message: %" PRIVATE_LOG_STRING, this, m_database.lastErrorMsg());
     702        ASSERT_NOT_REACHED();
     703        return;
     704    }
     705    if (statement->step() != SQLITE_DONE) {
     706        RELEASE_LOG_ERROR(PrivateClickMeasurement, "%p - Database::addMissingColumnToTable error executing statement to add missing columns to table, error message: %" PRIVATE_LOG_STRING, this, m_database.lastErrorMsg());
     707        ASSERT_NOT_REACHED();
     708    }
     709}
     710
    663711} // namespace PCM
    664712
  • trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementDatabase.h

    r281886 r282884  
    6969    std::pair<std::optional<UnattributedPrivateClickMeasurement>, std::optional<AttributedPrivateClickMeasurement>> findPrivateClickMeasurement(const WebCore::PrivateClickMeasurement::SourceSite&, const WebCore::PrivateClickMeasurement::AttributionDestinationSite&);
    7070    void removeUnattributed(WebCore::PrivateClickMeasurement&);
    71     String attributionToStringForTesting(WebCore::SQLiteStatement&, PrivateClickMeasurementAttributionType) const;
     71    String attributionToStringForTesting(const WebCore::PrivateClickMeasurement&) const;
    7272    void markReportAsSentToDestination(SourceDomainID, DestinationDomainID);
    7373    void markReportAsSentToSource(SourceDomainID, DestinationDomainID);
     
    7676    std::optional<DomainID> domainID(const WebCore::RegistrableDomain&);
    7777    String getDomainStringFromDomainID(DomainID) const final;
     78
     79    void addBundleIDColumnIfNecessary();
     80    Vector<String> columnsForTable(const String& tableName);
     81    void addMissingColumnToTable(const String& tableName, const String& columnName);
    7882
    7983    using Statement = std::unique_ptr<WebCore::SQLiteStatement>;
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h

    r282370 r282884  
    421421@property (nonatomic, copy, setter=_setUIEventAttribution:) UIEventAttribution *_uiEventAttribution WK_API_AVAILABLE(ios(15.0));
    422422@property (nonatomic, copy, setter=_setEphemeralUIEventAttribution:) UIEventAttribution *_ephemeralUIEventAttribution WK_API_AVAILABLE(ios(WK_IOS_TBA));
     423- (void)_setEphemeralUIEventAttribution:(UIEventAttribution *)attribution forApplicationWithBundleID:(NSString *)bundleID WK_API_AVAILABLE(ios(WK_IOS_TBA));
    423424#endif
    424425
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h

    r281779 r282884  
    4545@interface WKWebView (WKTesting)
    4646
    47 - (void)_addEventAttributionWithSourceID:(uint8_t)sourceID destinationURL:(NSURL *)destination sourceDescription:(NSString *)sourceDescription purchaser:(NSString *)purchaser reportEndpoint:(NSURL *)reportEndpoint optionalNonce:(nullable NSString *)nonce WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     47- (void)_addEventAttributionWithSourceID:(uint8_t)sourceID destinationURL:(NSURL *)destination sourceDescription:(NSString *)sourceDescription purchaser:(NSString *)purchaser reportEndpoint:(NSURL *)reportEndpoint optionalNonce:(nullable NSString *)nonce applicationBundleID:(NSString *)bundleID WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    4848
    4949- (void)_setPageScale:(CGFloat)scale withOrigin:(CGPoint)origin;
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm

    r281779 r282884  
    5656@implementation WKWebView (WKTesting)
    5757
    58 - (void)_addEventAttributionWithSourceID:(uint8_t)sourceID destinationURL:(NSURL *)destination sourceDescription:(NSString *)sourceDescription purchaser:(NSString *)purchaser reportEndpoint:(NSURL *)reportEndpoint optionalNonce:(NSString *)nonce
     58- (void)_addEventAttributionWithSourceID:(uint8_t)sourceID destinationURL:(NSURL *)destination sourceDescription:(NSString *)sourceDescription purchaser:(NSString *)purchaser reportEndpoint:(NSURL *)reportEndpoint optionalNonce:(NSString *)nonce applicationBundleID:(NSString *)bundleID
    5959{
    6060    WebCore::PrivateClickMeasurement measurement(
     
    6262        WebCore::PrivateClickMeasurement::SourceSite(reportEndpoint),
    6363        WebCore::PrivateClickMeasurement::AttributionDestinationSite(destination),
     64        bundleID,
    6465        sourceDescription,
    6566        purchaser
  • trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm

    r281825 r282884  
    5858#import <WebCore/LocalCurrentTraitCollection.h>
    5959#import <WebCore/MIMETypeRegistry.h>
     60#import <WebCore/RuntimeApplicationChecks.h>
    6061#import <WebCore/VersionChecks.h>
    6162#import <pal/spi/cocoa/QuartzCoreSPI.h>
     
    26322633            WebCore::PrivateClickMeasurement::SourceSite(attribution.reportEndpoint),
    26332634            WebCore::PrivateClickMeasurement::AttributionDestinationSite(attribution.destinationURL),
     2635            WebCore::applicationBundleIdentifier(),
    26342636            attribution.sourceDescription,
    26352637            attribution.purchaser
     
    26572659- (void)_setEphemeralUIEventAttribution:(UIEventAttribution *)attribution
    26582660{
     2661    // FIXME: Deprecate and remove this version without a bundle ID.
     2662    [self _setEphemeralUIEventAttribution:attribution forApplicationWithBundleID:@"com.apple.mobilesafari"];
     2663}
     2664
     2665- (void)_setEphemeralUIEventAttribution:(UIEventAttribution *)attribution forApplicationWithBundleID:(NSString *)bundleID
     2666{
    26592667#if HAVE(UI_EVENT_ATTRIBUTION)
    26602668    if (attribution) {
     
    26632671            WebCore::PrivateClickMeasurement::SourceSite(attribution.reportEndpoint),
    26642672            WebCore::PrivateClickMeasurement::AttributionDestinationSite(attribution.destinationURL),
     2673            bundleID,
    26652674            attribution.sourceDescription,
    26662675            attribution.purchaser,
  • trunk/Tools/ChangeLog

    r282883 r282884  
     12021-09-22  Alex Christensen  <achristensen@webkit.org>
     2
     3        PCM should include the bundle ID of the app from which it originated
     4        https://bugs.webkit.org/show_bug.cgi?id=230576
     5        <rdar://83065221>
     6
     7        Reviewed by Kate Cheney.
     8
     9        * TestWebKitAPI/Tests/WebCore/PrivateClickMeasurement.cpp:
     10        (TestWebKitAPI::TEST):
     11        * TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm:
     12        (TestWebKitAPI::TEST):
     13        * TestWebKitAPI/Tests/WebKitCocoa/PrivateClickMeasurement.mm:
     14        (pollUntilPCMIsMigrated):
     15
    1162021-09-22  Alex Christensen  <achristensen@webkit.org>
    217
  • trunk/Tools/TestWebKitAPI/Tests/WebCore/PrivateClickMeasurement.cpp

    r279710 r282884  
    4545TEST(PrivateClickMeasurement, WellKnownURLs)
    4646{
    47     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(min6BitValue), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL } };
     47    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(min6BitValue), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
    4848    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(min6BitValue, PrivateClickMeasurement::Priority(min6BitValue)));
    4949
     
    5656TEST(PrivateClickMeasurement, ValidMinValues)
    5757{
    58     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(min6BitValue), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL } };
     58    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(min6BitValue), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
    5959    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(min6BitValue, PrivateClickMeasurement::Priority(min6BitValue)));
    6060
     
    6464TEST(PrivateClickMeasurement, ValidMidValues)
    6565{
    66     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID((uint32_t)192), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL } };
     66    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID((uint32_t)192), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
    6767    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData((uint32_t)9, PrivateClickMeasurement::Priority((uint32_t)22)));
    6868
     
    7272TEST(PrivateClickMeasurement, ValidMaxValues)
    7373{
    74     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL } };
     74    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
    7575    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
    7676
     
    8080TEST(PrivateClickMeasurement, EarliestTimeToSendAttributionMinimumDelay)
    8181{
    82     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL } };
     82    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
    8383    auto now = WallTime::now();
    8484    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
     
    135135TEST(PrivateClickMeasurement, InvalidSourceID)
    136136{
    137     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy + 1), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL } };
     137    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy + 1), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
    138138    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
    139139
     
    144144TEST(PrivateClickMeasurement, InvalidSourceHost)
    145145{
    146     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { emptyURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL } };
     146    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { emptyURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
    147147    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
    148148
     
    153153TEST(PrivateClickMeasurement, InvalidDestinationHost)
    154154{
    155     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy + 1), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { emptyURL } };
     155    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy + 1), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { emptyURL }, "test.bundle.identifier" };
    156156    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
    157157
     
    162162TEST(PrivateClickMeasurement, AttributionTriggerData)
    163163{
    164     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL } };
     164    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
    165165    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData((PrivateClickMeasurement::AttributionTriggerData::MaxEntropy + 1), PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
    166166
     
    171171TEST(PrivateClickMeasurement, InvalidPriority)
    172172{
    173     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL } };
     173    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
    174174    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy + 1)));
    175175
     
    180180TEST(PrivateClickMeasurement, InvalidMissingConversion)
    181181{
    182     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL } };
     182    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
    183183
    184184    ASSERT_TRUE(attribution.attributionReportSourceURL().isEmpty());
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm

    r282883 r282884  
    298298    auto webView = adoptNS([WKWebView new]);
    299299    webView.get().navigationDelegate = delegateAllowingAllTLS();
    300     [webView _addEventAttributionWithSourceID:42 destinationURL:exampleURL() sourceDescription:@"test source description" purchaser:@"test purchaser" reportEndpoint:serverURL optionalNonce:@"ABCDEFabcdef0123456789"];
     300    [webView _addEventAttributionWithSourceID:42 destinationURL:exampleURL() sourceDescription:@"test source description" purchaser:@"test purchaser" reportEndpoint:serverURL optionalNonce:@"ABCDEFabcdef0123456789" applicationBundleID:@"test.bundle.id"];
    301301    [[webView configuration].websiteDataStore _setResourceLoadStatisticsEnabled:YES];
    302302    [[webView configuration].websiteDataStore _trustServerForLocalPCMTesting:secTrustFromCertificateChain(@[(id)testCertificate().get()]).get()];
     
    319319{
    320320    runBasicEventAttributionTest(nil, [](WKWebView *webView, const HTTPServer& server) {
    321         [webView _addEventAttributionWithSourceID:42 destinationURL:exampleURL() sourceDescription:@"test source description" purchaser:@"test purchaser" reportEndpoint:server.request().URL optionalNonce:nil];
     321        [webView _addEventAttributionWithSourceID:42 destinationURL:exampleURL() sourceDescription:@"test source description" purchaser:@"test purchaser" reportEndpoint:server.request().URL optionalNonce:nil applicationBundleID:@"test.bundle.id"];
    322322    });
    323323}
     
    341341        viewConfiguration.get().websiteDataStore = dataStore.get();
    342342        runBasicEventAttributionTest(viewConfiguration.get(), [](WKWebView *webView, const HTTPServer& server) {
    343             [webView _addEventAttributionWithSourceID:42 destinationURL:exampleURL() sourceDescription:@"test source description" purchaser:@"test purchaser" reportEndpoint:server.request().URL optionalNonce:nil];
     343            [webView _addEventAttributionWithSourceID:42 destinationURL:exampleURL() sourceDescription:@"test source description" purchaser:@"test purchaser" reportEndpoint:server.request().URL optionalNonce:nil applicationBundleID:@"test.bundle.id"];
    344344        });
    345345        originalNetworkProcessPid = [dataStore _networkProcessIdentifier];
     
    473473    viewConfiguration.get().websiteDataStore = adoptNS([[WKWebsiteDataStore alloc] _initWithConfiguration:dataStoreConfiguration.get()]).get();
    474474    runBasicEventAttributionTest(viewConfiguration.get(), [](WKWebView *webView, const HTTPServer& server) {
    475         [webView _addEventAttributionWithSourceID:42 destinationURL:exampleURL() sourceDescription:@"test source description" purchaser:@"test purchaser" reportEndpoint:server.request().URL optionalNonce:nil];
     475        [webView _addEventAttributionWithSourceID:42 destinationURL:exampleURL() sourceDescription:@"test source description" purchaser:@"test purchaser" reportEndpoint:server.request().URL optionalNonce:nil applicationBundleID:@"test.bundle.id"];
    476476    });
    477477
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/PrivateClickMeasurement.mm

    r281881 r282884  
    189189        "Source ID: 43\n"
    190190        "No attribution trigger data.\n"
     191#if PLATFORM(MAC)
     192        "Application bundle identifier: com.apple.Safari\n"
     193#else
     194        "Application bundle identifier: com.apple.mobilesafari\n"
     195#endif
    191196        "\n"
    192197        "Attributed Private Click Measurements:\n"
     
    197202        "Attribution trigger data: 14\n"
    198203        "Attribution priority: 7\n"
    199         "Attribution earliest time to send: Outside 24-48 hours\n";
     204        "Attribution earliest time to send: Outside 24-48 hours\n"
     205#if PLATFORM(MAC)
     206        "Application bundle identifier: com.apple.Safari\n"
     207#else
     208        "Application bundle identifier: com.apple.mobilesafari\n"
     209#endif
     210        "";
    200211
    201212    while (![dumpedPCM(webView) isEqualToString:expectedMigratedPCMDatabase])
Note: See TracChangeset for help on using the changeset viewer.