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

Changeset 283313 in webkit


Ignore:
Timestamp:
Sep 30, 2021, 8:42:31 AM (5 years ago)
Author:
commit-queue@webkit.org
Message:

Clean up PrivateClickMeasurement
https://bugs.webkit.org/show_bug.cgi?id=230978

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

Source/WebCore:

In r270669 I added sourceDescription and purchaser to PrivateClickMeasurement,
but they're actually only needed for the UIEventAttribution getter on WKWebView.
I moved them to a new struct PrivateClickMeasurementAndMetadata which stores this additional
information only on WebPageProxy instead of all the PCM infrastructure.

I reduced the size of SourceID.id to 1 byte. Now a SourceID is always valid, so we don't need
to check after it has been created. We still check when creating one from parsing web content,
but everywhere else we know that it is valid because of its type.

I removed the default constructor of PrivateClickMeasurement and default parameter values.
There aren't very many places where we construct one except for the tests, and it's good to see
what values we are using so we don't forget anything.

No change in behavior.

  • html/HTMLAnchorElement.cpp:

(WebCore::HTMLAnchorElement::parsePrivateClickMeasurement const):

  • loader/PrivateClickMeasurement.cpp:

(WebCore::PrivateClickMeasurement::isValid const):
(WebCore::PrivateClickMeasurement::isolatedCopy const):
(WebCore::PrivateClickMeasurement::parseAttributionRequest):

  • loader/PrivateClickMeasurement.h:

(WebCore::PrivateClickMeasurement::SourceID::SourceID):
(WebCore::PrivateClickMeasurement::Priority::Priority):
(WebCore::PrivateClickMeasurement::AttributionTriggerData::AttributionTriggerData):
(WebCore::PrivateClickMeasurement::PrivateClickMeasurement):
(WebCore::PrivateClickMeasurement::isEphemeral const):
(WebCore::PrivateClickMeasurement::setEphemeral):
(WebCore::PrivateClickMeasurement::encode const):
(WebCore::PrivateClickMeasurement::decode):
(WebCore::PrivateClickMeasurement::AttributionTriggerData::decode):
(WTF::HashTraits<WebCore::PrivateClickMeasurement::SourceSite>::emptyValue):
(WebCore::PrivateClickMeasurement::SourceID::isValid const): Deleted.
(WebCore::PrivateClickMeasurement::sourceDescription const): Deleted.
(WebCore::PrivateClickMeasurement::purchaser const): Deleted.

Source/WebKit:

  • NetworkProcess/DatabaseUtilities.cpp:

(WebKit::DatabaseUtilities::buildPrivateClickMeasurementFromDatabase const):

  • NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.cpp:

(WebKit::PrivateClickMeasurementManager::insertPrivateClickMeasurement):

  • UIProcess/API/Cocoa/WKWebViewTesting.mm:

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

  • UIProcess/API/ios/WKWebViewIOS.mm:

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

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::didCommitLoadForFrame):
(WebKit::WebPageProxy::createNewPage):

  • UIProcess/WebPageProxy.h:

Tools:

I removed the InvalidSourceID test because it is now impossible to make an invalid source ID
because it uses a uint8_t and allows the values 0-255.

  • TestWebKitAPI/Tests/WebCore/PrivateClickMeasurement.cpp:

(TestWebKitAPI::TEST):

  • TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm:

(TestWebKitAPI::TEST):

Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r283312 r283313  
     12021-09-30  Alex Christensen  <achristensen@webkit.org>
     2
     3        Clean up PrivateClickMeasurement
     4        https://bugs.webkit.org/show_bug.cgi?id=230978
     5
     6        Reviewed by Kate Cheney.
     7
     8        In r270669 I added sourceDescription and purchaser to PrivateClickMeasurement,
     9        but they're actually only needed for the UIEventAttribution getter on WKWebView.
     10        I moved them to a new struct PrivateClickMeasurementAndMetadata which stores this additional
     11        information only on WebPageProxy instead of all the PCM infrastructure.
     12
     13        I reduced the size of SourceID.id to 1 byte.  Now a SourceID is always valid, so we don't need
     14        to check after it has been created.  We still check when creating one from parsing web content,
     15        but everywhere else we know that it is valid because of its type.
     16
     17        I removed the default constructor of PrivateClickMeasurement and default parameter values.
     18        There aren't very many places where we construct one except for the tests, and it's good to see
     19        what values we are using so we don't forget anything.
     20
     21        No change in behavior.
     22
     23        * html/HTMLAnchorElement.cpp:
     24        (WebCore::HTMLAnchorElement::parsePrivateClickMeasurement const):
     25        * loader/PrivateClickMeasurement.cpp:
     26        (WebCore::PrivateClickMeasurement::isValid const):
     27        (WebCore::PrivateClickMeasurement::isolatedCopy const):
     28        (WebCore::PrivateClickMeasurement::parseAttributionRequest):
     29        * loader/PrivateClickMeasurement.h:
     30        (WebCore::PrivateClickMeasurement::SourceID::SourceID):
     31        (WebCore::PrivateClickMeasurement::Priority::Priority):
     32        (WebCore::PrivateClickMeasurement::AttributionTriggerData::AttributionTriggerData):
     33        (WebCore::PrivateClickMeasurement::PrivateClickMeasurement):
     34        (WebCore::PrivateClickMeasurement::isEphemeral const):
     35        (WebCore::PrivateClickMeasurement::setEphemeral):
     36        (WebCore::PrivateClickMeasurement::encode const):
     37        (WebCore::PrivateClickMeasurement::decode):
     38        (WebCore::PrivateClickMeasurement::AttributionTriggerData::decode):
     39        (WTF::HashTraits<WebCore::PrivateClickMeasurement::SourceSite>::emptyValue):
     40        (WebCore::PrivateClickMeasurement::SourceID::isValid const): Deleted.
     41        (WebCore::PrivateClickMeasurement::sourceDescription const): Deleted.
     42        (WebCore::PrivateClickMeasurement::purchaser const): Deleted.
     43
    1442021-09-30  Alan Bujtas  <zalan@apple.com>
    245
  • trunk/Source/WebCore/html/HTMLAnchorElement.cpp

    r282884 r283313  
    456456    String bundleID;
    457457#endif
    458     auto privateClickMeasurement = PrivateClickMeasurement { SourceID(attributionSourceID.value()), SourceSite(WTFMove(documentRegistrableDomain)), AttributionDestinationSite(destinationURL), bundleID };
     458    auto privateClickMeasurement = PrivateClickMeasurement { SourceID(attributionSourceID.value()), SourceSite(WTFMove(documentRegistrableDomain)), AttributionDestinationSite(destinationURL), bundleID, WallTime::now(), PrivateClickMeasurement::AttributionEphemeral::No };
    459459
    460460    auto attributionSourceNonceAttr = attributeWithoutSynchronization(attributionsourcenonceAttr);
  • trunk/Source/WebCore/loader/PrivateClickMeasurement.cpp

    r282884 r283313  
    5555    return m_attributionTriggerData
    5656        && m_attributionTriggerData.value().isValid()
    57         && m_sourceID.isValid()
    5857        && !m_sourceSite.registrableDomain.isEmpty()
    5958        && !m_destinationSite.registrableDomain.isEmpty()
     
    8988PrivateClickMeasurement PrivateClickMeasurement::isolatedCopy() const
    9089{
    91     PrivateClickMeasurement copy;
    92     copy.m_sourceID = m_sourceID;
    93     copy.m_sourceSite = m_sourceSite.isolatedCopy();
    94     copy.m_destinationSite = m_destinationSite.isolatedCopy();
    95     copy.m_sourceDescription = m_sourceDescription.isolatedCopy();
    96     copy.m_purchaser = m_purchaser.isolatedCopy();
    97     copy.m_timeOfAdClick = m_timeOfAdClick.isolatedCopy();
    98     copy.m_isEphemeral = m_isEphemeral;
     90    PrivateClickMeasurement copy {
     91        m_sourceID,
     92        m_sourceSite.isolatedCopy(),
     93        m_destinationSite.isolatedCopy(),
     94        m_sourceApplicationBundleID.isolatedCopy(),
     95        m_timeOfAdClick.isolatedCopy(),
     96        m_isEphemeral,
     97    };
    9998    copy.m_attributionTriggerData = m_attributionTriggerData;
    10099    copy.m_timesToSend = m_timesToSend;
     
    102101    copy.m_sourceUnlinkableToken = m_sourceUnlinkableToken.isolatedCopy();
    103102    copy.m_sourceSecretToken = crossThreadCopy(m_sourceSecretToken);
    104     copy.m_sourceApplicationBundleID = m_sourceApplicationBundleID.isolatedCopy();
    105103    return copy;
    106104}
     
    122120            return makeUnexpected(makeString("[Private Click Measurement] Conversion was not accepted because the conversion data could not be parsed or was higher than the allowed maximum of "_s, AttributionTriggerData::MaxEntropy, "."_s));
    123121
    124         return AttributionTriggerData { static_cast<uint32_t>(*attributionTriggerDataUInt64), Priority { 0 } };
     122        return AttributionTriggerData { static_cast<uint8_t>(*attributionTriggerDataUInt64), Priority { 0 } };
    125123    }
    126124   
     
    134132            return makeUnexpected(makeString("[Private Click Measurement] Conversion was not accepted because the priority could not be parsed or was higher than the allowed maximum of "_s, Priority::MaxEntropy, "."_s));
    135133
    136         return AttributionTriggerData { static_cast<uint32_t>(*attributionTriggerDataUInt64), Priority { static_cast<uint32_t>(*attributionPriorityUInt64) } };
     134        return AttributionTriggerData { static_cast<uint8_t>(*attributionTriggerDataUInt64), Priority { static_cast<uint8_t>(*attributionPriorityUInt64) } };
    137135    }
    138136
  • trunk/Source/WebCore/loader/PrivateClickMeasurement.h

    r282884 r283313  
    4848namespace WebCore {
    4949
    50 enum class PrivateClickMeasurementAttributionEphemeral : bool { No, Yes };
    51 
    5250class PrivateClickMeasurement {
    5351public:
    54     using PriorityValue = uint32_t;
     52    using PriorityValue = uint8_t;
     53    enum class AttributionEphemeral : bool { No, Yes };
    5554
    5655    enum class PcmDataCarried : bool { NonPersonallyIdentifiable, PersonallyIdentifiable };
     
    5857
    5958    struct SourceID {
    60         static constexpr uint32_t MaxEntropy = 255;
    61 
    62         SourceID() = default;
    63         explicit SourceID(uint32_t id)
     59        static constexpr uint8_t MaxEntropy = 255;
     60        explicit SourceID(uint8_t id)
    6461            : id { id }
    6562        {
    6663        }
    67        
    68         bool isValid() const
    69         {
    70             return id <= MaxEntropy;
    71         }
    72        
    73         uint32_t id { 0 };
     64
     65        uint8_t id { 0 };
    7466    };
    7567
    7668    struct SourceSite {
    77         SourceSite() = default;
    7869        explicit SourceSite(const URL& url)
    7970            : registrableDomain { url }
     
    167158
    168159    struct Priority {
    169         static constexpr uint32_t MaxEntropy = 63;
     160        static constexpr uint8_t MaxEntropy = 63;
    170161
    171162        explicit Priority(PriorityValue value)
    172         : value { value }
     163            : value { value }
    173164        {
    174165        }
     
    178169   
    179170    struct AttributionTriggerData {
    180         static constexpr uint32_t MaxEntropy = 15;
     171        static constexpr uint8_t MaxEntropy = 15;
    181172
    182173        enum class WasSent : bool { No, Yes };
    183174       
    184         AttributionTriggerData(uint32_t data, Priority priority, WasSent wasSent = WasSent::No)
     175        AttributionTriggerData(uint8_t data, Priority priority, WasSent wasSent = WasSent::No)
    185176            : data { data }
    186177            , priority { priority.value }
     
    194185        }
    195186       
    196         uint32_t data;
     187        uint8_t data { 0 };
    197188        PriorityValue priority;
    198189        WasSent wasSent = WasSent::No;
     
    312303    };
    313304
    314     PrivateClickMeasurement() = default;
    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)
     305    PrivateClickMeasurement(SourceID sourceID, const SourceSite& sourceSite, const AttributionDestinationSite& destinationSite, const String& sourceApplicationBundleID, WallTime timeOfAdClick, AttributionEphemeral isEphemeral)
    316306        : m_sourceID { sourceID }
    317307        , m_sourceSite { sourceSite }
    318308        , m_destinationSite { destinationSite }
    319         , m_sourceDescription { WTFMove(sourceDescription) }
    320         , m_purchaser { WTFMove(purchaser) }
    321309        , m_timeOfAdClick { timeOfAdClick }
    322310        , m_isEphemeral { isEphemeral }
     
    343331    const String& sourceApplicationBundleID() const { return m_sourceApplicationBundleID; }
    344332
    345     const String& sourceDescription() const { return m_sourceDescription; }
    346     const String& purchaser() const { return m_purchaser; }
    347     bool isEphemeral() const { return m_isEphemeral == PrivateClickMeasurementAttributionEphemeral::Yes; }
    348     void setEphemeral(PrivateClickMeasurementAttributionEphemeral isEphemeral) { m_isEphemeral = isEphemeral; }
     333    bool isEphemeral() const { return m_isEphemeral == AttributionEphemeral::Yes; }
     334    void setEphemeral(AttributionEphemeral isEphemeral) { m_isEphemeral = isEphemeral; }
    349335
    350336    // MARK: - Fraud Prevention
     
    398384    SourceSite m_sourceSite;
    399385    AttributionDestinationSite m_destinationSite;
    400     String m_sourceDescription;
    401     String m_purchaser;
    402386    WallTime m_timeOfAdClick;
    403     PrivateClickMeasurementAttributionEphemeral m_isEphemeral;
     387    AttributionEphemeral m_isEphemeral;
    404388
    405389    std::optional<AttributionTriggerData> m_attributionTriggerData;
     
    429413        << m_sourceSite.registrableDomain
    430414        << m_destinationSite.registrableDomain
    431         << m_sourceDescription
    432         << m_purchaser
    433415        << m_timeOfAdClick
    434416        << m_ephemeralSourceNonce
     
    442424std::optional<PrivateClickMeasurement> PrivateClickMeasurement::decode(Decoder& decoder)
    443425{
    444     std::optional<uint32_t> sourceID;
     426    std::optional<uint8_t> sourceID;
    445427    decoder >> sourceID;
    446428    if (!sourceID)
     
    457439        return std::nullopt;
    458440   
    459     std::optional<String> sourceDescription;
    460     decoder >> sourceDescription;
    461     if (!sourceDescription)
    462         return std::nullopt;
    463    
    464     std::optional<String> purchaser;
    465     decoder >> purchaser;
    466     if (!purchaser)
    467         return std::nullopt;
    468    
    469441    std::optional<WallTime> timeOfAdClick;
    470442    decoder >> timeOfAdClick;
     
    477449        return std::nullopt;
    478450
    479     std::optional<PrivateClickMeasurementAttributionEphemeral> isEphemeral;
     451    std::optional<AttributionEphemeral> isEphemeral;
    480452    decoder >> isEphemeral;
    481453    if (!isEphemeral)
     
    502474        AttributionDestinationSite { WTFMove(*destinationRegistrableDomain) },
    503475        WTFMove(*sourceApplicationBundleID),
    504         WTFMove(*sourceDescription),
    505         WTFMove(*purchaser),
    506476        WTFMove(*timeOfAdClick),
    507477        WTFMove(*isEphemeral)
     
    540510std::optional<PrivateClickMeasurement::AttributionTriggerData> PrivateClickMeasurement::AttributionTriggerData::decode(Decoder& decoder)
    541511{
    542     std::optional<uint32_t> data;
     512    std::optional<uint8_t> data;
    543513    decoder >> data;
    544514    if (!data)
     
    565535template<> struct DefaultHash<WebCore::PrivateClickMeasurement::SourceSite> : WebCore::PrivateClickMeasurement::SourceSiteHash { };
    566536template<> struct HashTraits<WebCore::PrivateClickMeasurement::SourceSite> : GenericHashTraits<WebCore::PrivateClickMeasurement::SourceSite> {
    567     static WebCore::PrivateClickMeasurement::SourceSite emptyValue() { return { }; }
     537    static WebCore::PrivateClickMeasurement::SourceSite emptyValue() { return WebCore::PrivateClickMeasurement::SourceSite(WebCore::RegistrableDomain()); }
    568538    static void constructDeletedValue(WebCore::PrivateClickMeasurement::SourceSite& slot) { new (NotNull, &slot.registrableDomain) WebCore::RegistrableDomain(WTF::HashTableDeletedValue); }
    569539    static bool isDeletedValue(const WebCore::PrivateClickMeasurement::SourceSite& slot) { return slot.registrableDomain.isHashTableDeletedValue(); }
  • trunk/Source/WebKit/ChangeLog

    r283304 r283313  
     12021-09-30  Alex Christensen  <achristensen@webkit.org>
     2
     3        Clean up PrivateClickMeasurement
     4        https://bugs.webkit.org/show_bug.cgi?id=230978
     5
     6        Reviewed by Kate Cheney.
     7
     8        * NetworkProcess/DatabaseUtilities.cpp:
     9        (WebKit::DatabaseUtilities::buildPrivateClickMeasurementFromDatabase const):
     10        * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.cpp:
     11        (WebKit::PrivateClickMeasurementManager::insertPrivateClickMeasurement):
     12        * UIProcess/API/Cocoa/WKWebViewTesting.mm:
     13        (-[WKWebView _addEventAttributionWithSourceID:destinationURL:sourceDescription:purchaser:reportEndpoint:optionalNonce:applicationBundleID:]):
     14        * UIProcess/API/ios/WKWebViewIOS.mm:
     15        (-[WKWebView _setUIEventAttribution:]):
     16        (-[WKWebView _uiEventAttribution]):
     17        (-[WKWebView _setEphemeralUIEventAttribution:forApplicationWithBundleID:]):
     18        * UIProcess/WebPageProxy.cpp:
     19        (WebKit::WebPageProxy::didCommitLoadForFrame):
     20        (WebKit::WebPageProxy::createNewPage):
     21        * UIProcess/WebPageProxy.h:
     22
    1232021-09-30  Carlos Garcia Campos  <cgarcia@igalia.com>
    224
  • trunk/Source/WebKit/NetworkProcess/DatabaseUtilities.cpp

    r283227 r283313  
    159159        bundleID = safariBundleID;
    160160
    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));
     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), WebCore::PrivateClickMeasurement::AttributionEphemeral::No);
    162162
    163163    if (attributionType == PrivateClickMeasurementAttributionType::Attributed) {
     
    168168
    169169        if (attributionTriggerData != -1)
    170             attribution.setAttribution(WebCore::PrivateClickMeasurement::AttributionTriggerData { static_cast<uint32_t>(attributionTriggerData), WebCore::PrivateClickMeasurement::Priority(priority) });
     170            attribution.setAttribution(WebCore::PrivateClickMeasurement::AttributionTriggerData { static_cast<uint8_t>(attributionTriggerData), WebCore::PrivateClickMeasurement::Priority(priority) });
    171171
    172172        std::optional<WallTime> sourceEarliestTimeToSend;
  • trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.cpp

    r282269 r283313  
    218218{
    219219    if (m_isRunningEphemeralMeasurementTest)
    220         measurement.setEphemeral(PrivateClickMeasurementAttributionEphemeral::Yes);
     220        measurement.setEphemeral(PrivateClickMeasurement::AttributionEphemeral::Yes);
    221221    if (measurement.isEphemeral()) {
    222222        m_ephemeralMeasurement = WTFMove(measurement);
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm

    r282884 r283313  
    6363        WebCore::PrivateClickMeasurement::AttributionDestinationSite(destination),
    6464        bundleID,
    65         sourceDescription,
    66         purchaser
     65        WallTime::now(),
     66        WebCore::PrivateClickMeasurement::AttributionEphemeral::No
    6767    );
    6868    if (nonce)
    6969        measurement.setEphemeralSourceNonce({ nonce });
    7070
    71     _page->setPrivateClickMeasurement(WTFMove(measurement));
     71    _page->setPrivateClickMeasurement({{ WTFMove(measurement), { }, { }}});
    7272}
    7373
  • trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm

    r282884 r283313  
    26342634            WebCore::PrivateClickMeasurement::AttributionDestinationSite(attribution.destinationURL),
    26352635            WebCore::applicationBundleIdentifier(),
    2636             attribution.sourceDescription,
    2637             attribution.purchaser
     2636            WallTime::now(),
     2637            WebCore::PrivateClickMeasurement::AttributionEphemeral::No
    26382638        );
    2639         _page->setPrivateClickMeasurement(WTFMove(measurement));
     2639        _page->setPrivateClickMeasurement({{ WTFMove(measurement), attribution.sourceDescription, attribution.purchaser }});
    26402640    } else
    26412641        _page->setPrivateClickMeasurement(std::nullopt);
     
    26472647#if HAVE(UI_EVENT_ATTRIBUTION)
    26482648    auto& measurement = _page->privateClickMeasurement();
    2649     if (!measurement || !measurement->sourceID().isValid())
     2649    if (!measurement)
    26502650        return nil;
    26512651
    2652     auto destinationURL = URL(URL(), makeString("https://", measurement->destinationSite().registrableDomain.string()));
    2653     return adoptNS([[UIEventAttribution alloc] initWithSourceIdentifier:measurement->sourceID().id destinationURL:destinationURL sourceDescription:measurement->sourceDescription() purchaser:measurement->purchaser()]).autorelease();
     2652    auto destinationURL = URL(URL(), makeString("https://", measurement->pcm.destinationSite().registrableDomain.string()));
     2653    return adoptNS([[UIEventAttribution alloc] initWithSourceIdentifier:measurement->pcm.sourceID().id destinationURL:destinationURL sourceDescription:measurement->sourceDescription purchaser:measurement->purchaser]).autorelease();
    26542654#else
    26552655    return nil;
     
    26722672            WebCore::PrivateClickMeasurement::AttributionDestinationSite(attribution.destinationURL),
    26732673            bundleID,
    2674             attribution.sourceDescription,
    2675             attribution.purchaser,
    26762674            WallTime::now(),
    2677             WebCore::PrivateClickMeasurementAttributionEphemeral::Yes
     2675            WebCore::PrivateClickMeasurement::AttributionEphemeral::Yes
    26782676        );
    2679         _page->setPrivateClickMeasurement(WTFMove(measurement));
     2677        _page->setPrivateClickMeasurement({{ WTFMove(measurement), attribution.sourceDescription, attribution.purchaser }});
    26802678    } else
    26812679        _page->setPrivateClickMeasurement(std::nullopt);
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r283304 r283313  
    49274927        std::optional<WebCore::PrivateClickMeasurement> privateClickMeasurement;
    49284928        if (m_privateClickMeasurement)
    4929             privateClickMeasurement = m_privateClickMeasurement;
     4929            privateClickMeasurement = m_privateClickMeasurement->pcm;
    49304930        else if (navigation && navigation->privateClickMeasurement())
    49314931            privateClickMeasurement = navigation->privateClickMeasurement();
     
    58475847        newPage->m_shouldSuppressAppLinksInNextNavigationPolicyDecision = mainFrameURL.host() == request.url().host();
    58485848
    5849         newPage->m_privateClickMeasurement = privateClickMeasurement;
     5849        if (privateClickMeasurement)
     5850            newPage->m_privateClickMeasurement = {{ WTFMove(*privateClickMeasurement), { }, { }}};
    58505851#if HAVE(APP_SSO)
    58515852        newPage->m_shouldSuppressSOAuthorizationInNextNavigationPolicyDecision = true;
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r283304 r283313  
    717717    bool delegatesScrolling() const { return m_delegatesScrolling; }
    718718
    719     void setPrivateClickMeasurement(std::optional<WebCore::PrivateClickMeasurement>&& measurement) { m_privateClickMeasurement = WTFMove(measurement); }
    720     const std::optional<WebCore::PrivateClickMeasurement>& privateClickMeasurement() const { return m_privateClickMeasurement; }
     719    struct PrivateClickMeasurementAndMetadata {
     720        WebCore::PrivateClickMeasurement pcm;
     721        String sourceDescription;
     722        String purchaser;
     723    };
     724    void setPrivateClickMeasurement(std::optional<PrivateClickMeasurementAndMetadata>&& measurement) { m_privateClickMeasurement = WTFMove(measurement); }
     725    const std::optional<PrivateClickMeasurementAndMetadata>& privateClickMeasurement() const { return m_privateClickMeasurement; }
    721726
    722727    enum class ActivityStateChangeDispatchMode : bool { Deferrable, Immediate };
     
    30873092    bool m_isSuspended { false };
    30883093
    3089     std::optional<WebCore::PrivateClickMeasurement> m_privateClickMeasurement;
     3094    std::optional<PrivateClickMeasurementAndMetadata> m_privateClickMeasurement;
    30903095
    30913096#if ENABLE(WEBXR) && !USE(OPENXR)
  • trunk/Tools/ChangeLog

    r283298 r283313  
     12021-09-30  Alex Christensen  <achristensen@webkit.org>
     2
     3        Clean up PrivateClickMeasurement
     4        https://bugs.webkit.org/show_bug.cgi?id=230978
     5
     6        Reviewed by Kate Cheney.
     7
     8        I removed the InvalidSourceID test because it is now impossible to make an invalid source ID
     9        because it uses a uint8_t and allows the values 0-255.
     10
     11        * TestWebKitAPI/Tests/WebCore/PrivateClickMeasurement.cpp:
     12        (TestWebKitAPI::TEST):
     13        * TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm:
     14        (TestWebKitAPI::TEST):
     15
    1162021-09-29  Alex Christensen  <achristensen@webkit.org>
    217
  • trunk/Tools/TestWebKitAPI/Tests/WebCore/PrivateClickMeasurement.cpp

    r282884 r283313  
    4545TEST(PrivateClickMeasurement, WellKnownURLs)
    4646{
    47     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(min6BitValue), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
     47    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(min6BitValue), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier", WallTime::now(), WebCore::PrivateClickMeasurement::AttributionEphemeral::No };
    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 }, "test.bundle.identifier" };
     58    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(min6BitValue), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier", WallTime::now(), WebCore::PrivateClickMeasurement::AttributionEphemeral::No };
    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 }, "test.bundle.identifier" };
     66    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID((uint32_t)192), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier", WallTime::now(), WebCore::PrivateClickMeasurement::AttributionEphemeral::No };
    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 }, "test.bundle.identifier" };
     74    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier", WallTime::now(), WebCore::PrivateClickMeasurement::AttributionEphemeral::No };
    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 }, "test.bundle.identifier" };
     82    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier", WallTime::now(), WebCore::PrivateClickMeasurement::AttributionEphemeral::No };
    8383    auto now = WallTime::now();
    8484    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
     
    133133// Negative test cases.
    134134
    135 TEST(PrivateClickMeasurement, InvalidSourceID)
    136 {
    137     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy + 1), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
     135TEST(PrivateClickMeasurement, InvalidSourceHost)
     136{
     137    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { emptyURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier", WallTime::now(), WebCore::PrivateClickMeasurement::AttributionEphemeral::No };
    138138    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
    139139
     
    142142}
    143143
    144 TEST(PrivateClickMeasurement, InvalidSourceHost)
    145 {
    146     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { emptyURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
     144TEST(PrivateClickMeasurement, InvalidDestinationHost)
     145{
     146    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { emptyURL }, "test.bundle.identifier", WallTime::now(), WebCore::PrivateClickMeasurement::AttributionEphemeral::No };
    147147    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
    148148
     
    151151}
    152152
    153 TEST(PrivateClickMeasurement, InvalidDestinationHost)
    154 {
    155     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy + 1), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { emptyURL }, "test.bundle.identifier" };
    156     attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
    157 
    158     ASSERT_TRUE(attribution.attributionReportSourceURL().isEmpty());
    159     ASSERT_TRUE(attribution.attributionReportAttributeOnURL().isEmpty());
    160 }
    161 
    162153TEST(PrivateClickMeasurement, AttributionTriggerData)
    163154{
    164     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
     155    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier", WallTime::now(), WebCore::PrivateClickMeasurement::AttributionEphemeral::No };
    165156    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData((PrivateClickMeasurement::AttributionTriggerData::MaxEntropy + 1), PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy)));
    166157
     
    171162TEST(PrivateClickMeasurement, InvalidPriority)
    172163{
    173     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
     164    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier", WallTime::now(), WebCore::PrivateClickMeasurement::AttributionEphemeral::No };
    174165    attribution.attributeAndGetEarliestTimeToSend(PrivateClickMeasurement::AttributionTriggerData(PrivateClickMeasurement::AttributionTriggerData::MaxEntropy, PrivateClickMeasurement::Priority(PrivateClickMeasurement::Priority::MaxEntropy + 1)));
    175166
     
    180171TEST(PrivateClickMeasurement, InvalidMissingConversion)
    181172{
    182     PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier" };
     173    PrivateClickMeasurement attribution { PrivateClickMeasurement::SourceID(PrivateClickMeasurement::SourceID::MaxEntropy), PrivateClickMeasurement::SourceSite { webKitURL }, PrivateClickMeasurement::AttributionDestinationSite { exampleURL }, "test.bundle.identifier", WallTime::now(), WebCore::PrivateClickMeasurement::AttributionEphemeral::No };
    183174
    184175    ASSERT_TRUE(attribution.attributionReportSourceURL().isEmpty());
     
    313304    const char serverPublicKeyBase64URL[] = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzb1dThrtYwVh46SjInegKhAqpbJwm1XnTBCvybSK8zk53R0Am1hG33AVF5J1lqYf36wp663GasclHtqzvxFZIvDA1DUSH4aZz_fDHCTTxEeJVPORS3zNN2UjWwbtnwsh4BmDTi-z_cDn0LAz2JuZyKlyFt5GgVLAQvL9H3VLHU9_XHNK-uboyXfcHRTtrDnpu3c6wvX5dd-AJoLmIQTZBEJfVkxBGznk1qKHjc6nASAirKF_wJCnuwAK8C6BAcjNcwUWCeKp0YECzCXU--JXd2OEU-QhxPC67faiDOh3V0vlfqZLtrlbnanUCKrvhw7GaGOGYotIrnZtuNfxC14d_XNVd1FS8nHjRTHnEgw_jnlSssfgStz0uJtcmkfgoJBvOE4mIRpi7iSlRfXNkKsWX1J-gwcnCVo5u0uJEW6X6NyvEGYJ8w5BPfwsQuK9y-4Z7ikt9IOucEHY7ThDmi9TNNhHBVj0Gu4wGoSjq3a6vL5N10ZSHXoq1XgfGPrmHhhL90cjvWonoyOXsUqlXEzTjD2W9897Q-Mx9BUNrGQPqmIx8F5MwxWcOrye8WRp4Q88n2YSUnV7C8ayld3v1Fh7N5jeSqeVmtDVRYTn2sVfNqgXrzgdigJcQR8vFENu6nzFPwsrXPMaCiLUnZNUmQ1ZSLQeQyhYXxHqRJrnuCDWXLkCAwEAAQ";
    314305
    315     PrivateClickMeasurement pcm;
     306    WebCore::PrivateClickMeasurement pcm(
     307        WebCore::PrivateClickMeasurement::SourceID({ }),
     308        WebCore::PrivateClickMeasurement::SourceSite(URL()),
     309        WebCore::PrivateClickMeasurement::AttributionDestinationSite(URL()),
     310        { },
     311        WallTime::now(),
     312        WebCore::PrivateClickMeasurement::AttributionEphemeral::No
     313    );
    316314    auto sourceUnlinkableToken = pcm.tokenSignatureJSON();
    317315    EXPECT_EQ(sourceUnlinkableToken->asObject()->size(), 0ul);
  • trunk/Tools/TestWebKitAPI/Tests/WebCore/cocoa/PrivateClickMeasurementCocoa.mm

    r279710 r283313  
    4343    EXPECT_TRUE(ephemeralNonce.isValid());
    4444
    45     PrivateClickMeasurement pcm;
     45    WebCore::PrivateClickMeasurement pcm(
     46        WebCore::PrivateClickMeasurement::SourceID({ }),
     47        WebCore::PrivateClickMeasurement::SourceSite(URL()),
     48        WebCore::PrivateClickMeasurement::AttributionDestinationSite(URL()),
     49        { },
     50        WallTime::now(),
     51        WebCore::PrivateClickMeasurement::AttributionEphemeral::No
     52    );
    4653    pcm.setEphemeralSourceNonce(WTFMove(ephemeralNonce));
    4754
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm

    r283298 r283313  
    494494        auto attribution = adoptNS([[MockEventAttribution alloc] initWithReportEndpoint:server.request().URL destinationURL:exampleURL()]);
    495495        webView._uiEventAttribution = (UIEventAttribution *)attribution.get();
     496        EXPECT_WK_STREQ(webView._uiEventAttribution.sourceDescription, "test source description");
     497        EXPECT_WK_STREQ(webView._uiEventAttribution.purchaser, "test purchaser");
    496498    });
    497499}
Note: See TracChangeset for help on using the changeset viewer.