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

Changeset 270669 in webkit


Ignore:
Timestamp:
Dec 10, 2020, 11:41:15 PM (6 years ago)
Author:
commit-queue@webkit.org
Message:

Accept click measurement data from hosting application
https://bugs.webkit.org/show_bug.cgi?id=219763
<rdar://problem/72121094>

Patch by Alex Christensen <achristensen@webkit.org> on 2020-12-10
Reviewed by John Wilander.

Source/WebCore:

Covered by an API test.

  • loader/PrivateClickMeasurement.h:

(WebCore::PrivateClickMeasurement::PrivateClickMeasurement):
(WebCore::PrivateClickMeasurement::sourceID const):
(WebCore::PrivateClickMeasurement::sourceDescription const):
(WebCore::PrivateClickMeasurement::purchaser const):
(WebCore::PrivateClickMeasurement::encode const):
(WebCore::PrivateClickMeasurement::decode):
(WebCore::PrivateClickMeasurement::sourceID): Deleted.

Source/WebKit:

  • NetworkProcess/Classifier/ResourceLoadStatisticsDatabaseStore.cpp:

(WebKit::ResourceLoadStatisticsDatabaseStore::buildPrivateClickMeasurementFromDatabase):

  • Platform/ios/UIKitSoftLink.h: Added.
  • Platform/ios/UIKitSoftLink.mm: Added.
  • Platform/spi/ios/UIKitSPI.h:
  • SourcesCocoa.txt:
  • UIProcess/API/Cocoa/WKWebViewPrivate.h:
  • UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h:
  • UIProcess/API/Cocoa/WKWebViewTesting.mm:

(-[WKWebView _setPrivateClickMeasurementOverrideTimerForTesting:completionHandler:]):
(-[WKWebView _setPrivateClickMeasurementConversionURLForTesting:completionHandler:]):

  • UIProcess/API/ios/WKWebViewIOS.mm:

(-[WKWebView _setEventAttribution:]):
(-[WKWebView _eventAttribution]):

  • UIProcess/WebPageProxy.cpp:

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

  • UIProcess/WebPageProxy.h:

(WebKit::WebPageProxy::setPrivateClickMeasurement):
(WebKit::WebPageProxy::privateClickMeasurement const):

  • WebKit.xcodeproj/project.pbxproj:

Tools:

  • TestWebKitAPI/SourcesCocoa.txt:
  • TestWebKitAPI/Tests/WebKitCocoa/Challenge.mm:

(testCertificate):

  • TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm: Added.

(-[MockEventAttribution initWithReportEndpoint:attributeOn:]):
(TestWebKitAPI::TEST):

  • TestWebKitAPI/cocoa/HTTPServer.h:
Location:
trunk
Files:
3 added
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r270668 r270669  
     12020-12-10  Alex Christensen  <achristensen@webkit.org>
     2
     3        Accept click measurement data from hosting application
     4        https://bugs.webkit.org/show_bug.cgi?id=219763
     5        <rdar://problem/72121094>
     6
     7        Reviewed by John Wilander.
     8
     9        Covered by an API test.
     10
     11        * loader/PrivateClickMeasurement.h:
     12        (WebCore::PrivateClickMeasurement::PrivateClickMeasurement):
     13        (WebCore::PrivateClickMeasurement::sourceID const):
     14        (WebCore::PrivateClickMeasurement::sourceDescription const):
     15        (WebCore::PrivateClickMeasurement::purchaser const):
     16        (WebCore::PrivateClickMeasurement::encode const):
     17        (WebCore::PrivateClickMeasurement::decode):
     18        (WebCore::PrivateClickMeasurement::sourceID): Deleted.
     19
    1202020-12-10  Peng Liu  <peng.liu6@apple.com>
    221
  • trunk/Source/WebCore/loader/PrivateClickMeasurement.h

    r270456 r270669  
    236236
    237237    PrivateClickMeasurement() = default;
    238     PrivateClickMeasurement(SourceID sourceID, const SourceSite& sourceSite, const AttributeOnSite& attributeOnSite, WallTime timeOfAdClick = WallTime::now())
     238    PrivateClickMeasurement(SourceID sourceID, const SourceSite& sourceSite, const AttributeOnSite& attributeOnSite, String&& sourceDescription = { }, String&& purchaser = { }, WallTime timeOfAdClick = WallTime::now())
    239239        : m_sourceID { sourceID }
    240240        , m_sourceSite { sourceSite }
    241241        , m_attributeOnSite { attributeOnSite }
     242        , m_sourceDescription { WTFMove(sourceDescription) }
     243        , m_purchaser { WTFMove(purchaser) }
    242244        , m_timeOfAdClick { timeOfAdClick }
    243245    {
     
    255257    Optional<WallTime> earliestTimeToSend() const { return m_earliestTimeToSend; };
    256258    void setEarliestTimeToSend(WallTime time) { m_earliestTimeToSend = time; }
    257     SourceID sourceID() { return m_sourceID; }
     259    const SourceID& sourceID() const { return m_sourceID; }
    258260    Optional<AttributionTriggerData> attributionTriggerData() { return m_attributionTriggerData; }
    259261    void setAttribution(AttributionTriggerData&& attributionTriggerData) { m_attributionTriggerData = WTFMove(attributionTriggerData); }
     262
     263    const String& sourceDescription() const { return m_sourceDescription; }
     264    const String& purchaser() const { return m_purchaser; }
    260265
    261266    template<class Encoder> void encode(Encoder&) const;
     
    269274    SourceSite m_sourceSite;
    270275    AttributeOnSite m_attributeOnSite;
     276    String m_sourceDescription;
     277    String m_purchaser;
    271278    WallTime m_timeOfAdClick;
    272279
     
    278285void PrivateClickMeasurement::encode(Encoder& encoder) const
    279286{
    280     encoder << m_sourceID.id << m_sourceSite.registrableDomain << m_attributeOnSite.registrableDomain << m_timeOfAdClick << m_attributionTriggerData << m_earliestTimeToSend;
     287    encoder << m_sourceID.id
     288        << m_sourceSite.registrableDomain
     289        << m_attributeOnSite.registrableDomain
     290        << m_sourceDescription
     291        << m_purchaser
     292        << m_timeOfAdClick
     293        << m_attributionTriggerData
     294        << m_earliestTimeToSend;
    281295}
    282296
     
    299313        return WTF::nullopt;
    300314   
     315    Optional<String> sourceDescription;
     316    decoder >> sourceDescription;
     317    if (!sourceDescription)
     318        return WTF::nullopt;
     319   
     320    Optional<String> purchaser;
     321    decoder >> purchaser;
     322    if (!purchaser)
     323        return WTF::nullopt;
     324   
    301325    Optional<WallTime> timeOfAdClick;
    302326    decoder >> timeOfAdClick;
     
    314338        return WTF::nullopt;
    315339   
    316     PrivateClickMeasurement attribution { SourceID { WTFMove(*sourceID) }, SourceSite { WTFMove(*sourceRegistrableDomain) }, AttributeOnSite { WTFMove(*attributeOnRegistrableDomain) } };
     340    PrivateClickMeasurement attribution {
     341        SourceID { WTFMove(*sourceID) },
     342        SourceSite { WTFMove(*sourceRegistrableDomain) },
     343        AttributeOnSite { WTFMove(*attributeOnRegistrableDomain) },
     344        WTFMove(*sourceDescription),
     345        WTFMove(*purchaser),
     346        WTFMove(*timeOfAdClick)
     347    };
    317348    attribution.m_attributionTriggerData = WTFMove(*attributionTriggerData);
    318349    attribution.m_earliestTimeToSend = WTFMove(*earliestTimeToSend);
  • trunk/Source/WebKit/ChangeLog

    r270668 r270669  
     12020-12-10  Alex Christensen  <achristensen@webkit.org>
     2
     3        Accept click measurement data from hosting application
     4        https://bugs.webkit.org/show_bug.cgi?id=219763
     5        <rdar://problem/72121094>
     6
     7        Reviewed by John Wilander.
     8
     9        * NetworkProcess/Classifier/ResourceLoadStatisticsDatabaseStore.cpp:
     10        (WebKit::ResourceLoadStatisticsDatabaseStore::buildPrivateClickMeasurementFromDatabase):
     11        * Platform/ios/UIKitSoftLink.h: Added.
     12        * Platform/ios/UIKitSoftLink.mm: Added.
     13        * Platform/spi/ios/UIKitSPI.h:
     14        * SourcesCocoa.txt:
     15        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
     16        * UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h:
     17        * UIProcess/API/Cocoa/WKWebViewTesting.mm:
     18        (-[WKWebView _setPrivateClickMeasurementOverrideTimerForTesting:completionHandler:]):
     19        (-[WKWebView _setPrivateClickMeasurementConversionURLForTesting:completionHandler:]):
     20        * UIProcess/API/ios/WKWebViewIOS.mm:
     21        (-[WKWebView _setEventAttribution:]):
     22        (-[WKWebView _eventAttribution]):
     23        * UIProcess/WebPageProxy.cpp:
     24        (WebKit::WebPageProxy::didCommitLoadForFrame):
     25        (WebKit::WebPageProxy::createNewPage):
     26        * UIProcess/WebPageProxy.h:
     27        (WebKit::WebPageProxy::setPrivateClickMeasurement):
     28        (WebKit::WebPageProxy::privateClickMeasurement const):
     29        * WebKit.xcodeproj/project.pbxproj:
     30
    1312020-12-10  Peng Liu  <peng.liu6@apple.com>
    232
  • trunk/Source/WebKit/NetworkProcess/Classifier/ResourceLoadStatisticsDatabaseStore.cpp

    r270197 r270669  
    29402940    auto timeOfAdClick = attributionType == PrivateClickMeasurementAttributionType::Attributed ? statement->getColumnDouble(5) : statement->getColumnDouble(3);
    29412941
    2942     PrivateClickMeasurement attribution(WebCore::PrivateClickMeasurement::SourceID(sourceID), WebCore::PrivateClickMeasurement::SourceSite(RegistrableDomain::uncheckedCreateFromRegistrableDomainString(sourceSiteDomain)), WebCore::PrivateClickMeasurement::AttributeOnSite(RegistrableDomain::uncheckedCreateFromRegistrableDomainString(attributeOnSiteDomain)), WallTime::fromRawSeconds(timeOfAdClick));
     2942    PrivateClickMeasurement attribution(WebCore::PrivateClickMeasurement::SourceID(sourceID), WebCore::PrivateClickMeasurement::SourceSite(RegistrableDomain::uncheckedCreateFromRegistrableDomainString(sourceSiteDomain)), WebCore::PrivateClickMeasurement::AttributeOnSite(RegistrableDomain::uncheckedCreateFromRegistrableDomainString(attributeOnSiteDomain)), { }, { }, WallTime::fromRawSeconds(timeOfAdClick));
    29432943   
    29442944    if (attributionType == PrivateClickMeasurementAttributionType::Attributed) {
  • trunk/Source/WebKit/Platform/spi/ios/UIKitSPI.h

    r269082 r270669  
    13481348@end
    13491349
     1350@interface _UIEventAttribution : NSObject <NSCopying>
     1351@property (nonatomic, assign, readonly) uint8_t sourceIdentifier;
     1352@property (nonatomic, copy, readonly) NSURL *attributeOn;
     1353@property (nonatomic, /*nullable,*/ copy, readonly) NSURL *reportEndpoint;
     1354@property (nonatomic, copy, readonly) NSString *sourceDescription;
     1355@property (nonatomic, copy, readonly) NSString *purchaser;
     1356- (instancetype)initWithSourceIdentifier:(uint8_t)sourceIdentifier attributeOn:(NSURL *)attributeOn sourceDescription:(NSString *)sourceDescription purchaser:(NSString *)purchaser;
     1357- (instancetype)init NS_UNAVAILABLE;
     1358+ (instancetype)new NS_UNAVAILABLE;
     1359@end
     1360
    13501361@interface _UINavigationInteractiveTransitionBase ()
    13511362- (void)_stopInteractiveTransition;
  • trunk/Source/WebKit/SourcesCocoa.txt

    r270638 r270669  
    8585Platform/ios/AccessibilityIOS.mm
    8686Platform/ios/PaymentAuthorizationController.mm
     87Platform/ios/UIKitSoftLink.mm
    8788
    8889Platform/IPC/cocoa/ConnectionCocoa.mm
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h

    r270638 r270669  
    113113@class WKFrameInfo;
    114114@class WKWebpagePreferences;
     115@class _UIEventAttribution;
    115116@class _WKApplicationManifest;
    116117@class _WKFrameHandle;
     
    365366@interface WKWebView (WKPrivateIOS)
    366367
     368@property (nonatomic, copy, setter=_setEventAttribution:) _UIEventAttribution *_eventAttribution WK_API_AVAILABLE(ios(WK_IOS_TBA));
     369
    367370@property (nonatomic, readonly) CGRect _contentVisibleRect WK_API_AVAILABLE(ios(10.0));
    368371
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivateForTesting.h

    r269394 r270669  
    8484
    8585- (NSNumber *)_suspendMediaPlaybackCounter WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     86
     87- (void)_setPrivateClickMeasurementOverrideTimerForTesting:(BOOL)overrideTimer completionHandler:(void(^)(void))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     88- (void)_setPrivateClickMeasurementConversionURLForTesting:(NSURL *)url completionHandler:(void(^)(void))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     89
    8690@end
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewTesting.mm

    r269394 r270669  
    297297}
    298298
     299- (void)_setPrivateClickMeasurementOverrideTimerForTesting:(BOOL)overrideTimer completionHandler:(void(^)(void))completionHandler
     300{
     301    _page->setPrivateClickMeasurementOverrideTimerForTesting(overrideTimer, [completionHandler = makeBlockPtr(completionHandler)] {
     302        completionHandler();
     303    });
     304}
     305
     306- (void)_setPrivateClickMeasurementConversionURLForTesting:(NSURL *)url completionHandler:(void(^)(void))completionHandler
     307{
     308    _page->setPrivateClickMeasurementConversionURLForTesting(url, [completionHandler = makeBlockPtr(completionHandler)] {
     309        completionHandler();
     310    });
     311}
     312
    299313- (void)_didPresentContactPicker
    300314{
  • trunk/Source/WebKit/UIProcess/API/ios/WKWebViewIOS.mm

    r269710 r270669  
    6363#endif
    6464
     65#include "UIKitSoftLink.h"
     66
    6567#define FORWARD_ACTION_TO_WKCONTENTVIEW(_action) \
    6668- (void)_action:(id)sender \
     
    24012403@implementation WKWebView (WKPrivateIOS)
    24022404
     2405- (void)_setEventAttribution:(_UIEventAttribution *)attribution
     2406{
     2407    if (attribution) {
     2408        WebCore::PrivateClickMeasurement measurement(
     2409            WebCore::PrivateClickMeasurement::SourceID(attribution.sourceIdentifier),
     2410            WebCore::PrivateClickMeasurement::SourceSite(attribution.reportEndpoint),
     2411            WebCore::PrivateClickMeasurement::AttributeOnSite(attribution.attributeOn),
     2412            attribution.sourceDescription,
     2413            attribution.purchaser
     2414        );
     2415        _page->setPrivateClickMeasurement(WTFMove(measurement));
     2416    } else
     2417        _page->setPrivateClickMeasurement(WTF::nullopt);
     2418}
     2419
     2420- (_UIEventAttribution *)_eventAttribution
     2421{
     2422    auto& measurement = _page->privateClickMeasurement();
     2423    if (!measurement || !measurement->sourceID().isValid())
     2424        return nil;
     2425
     2426    auto attributeOnURL = URL(URL(), makeString("https://", measurement->attributeOnSite().registrableDomain.string()));
     2427    return [[WebKit::alloc_UIEventAttributionInstance() initWithSourceIdentifier:measurement->sourceID().id attributeOn:attributeOnURL sourceDescription:measurement->sourceDescription() purchaser:measurement->purchaser()] autorelease];
     2428}
     2429
    24032430- (CGRect)_contentVisibleRect
    24042431{
  • trunk/Source/WebKit/UIProcess/WebPageProxy.cpp

    r270657 r270669  
    46804680    if (frame->isMainFrame()) {
    46814681        Optional<WebCore::PrivateClickMeasurement> privateClickMeasurement;
    4682         if (m_newPageNavigationPrivateClickMeasurement)
    4683             privateClickMeasurement = m_newPageNavigationPrivateClickMeasurement;
     4682        if (m_privateClickMeasurement)
     4683            privateClickMeasurement = m_privateClickMeasurement;
    46844684        else if (navigation && navigation->privateClickMeasurement())
    46854685            privateClickMeasurement = navigation->privateClickMeasurement();
     
    46894689        }
    46904690    }
    4691     m_newPageNavigationPrivateClickMeasurement.reset();
     4691    m_privateClickMeasurement.reset();
    46924692
    46934693    if (frame->isMainFrame()) {
     
    55625562        newPage->m_shouldSuppressAppLinksInNextNavigationPolicyDecision = mainFrameURL.host() == request.url().host();
    55635563
    5564         newPage->m_newPageNavigationPrivateClickMeasurement = privateClickMeasurement;
     5564        newPage->m_privateClickMeasurement = privateClickMeasurement;
    55655565#if HAVE(APP_SSO)
    55665566        newPage->m_shouldSuppressSOAuthorizationInNextNavigationPolicyDecision = true;
  • trunk/Source/WebKit/UIProcess/WebPageProxy.h

    r270638 r270669  
    673673    bool delegatesScrolling() const { return m_delegatesScrolling; }
    674674
     675    void setPrivateClickMeasurement(Optional<WebCore::PrivateClickMeasurement>&& measurement) { m_privateClickMeasurement = WTFMove(measurement); }
     676    const Optional<WebCore::PrivateClickMeasurement>& privateClickMeasurement() const { return m_privateClickMeasurement; }
     677
    675678    enum class ActivityStateChangeDispatchMode : bool { Deferrable, Immediate };
    676679    enum class ActivityStateChangeReplyMode : bool { Asynchronous, Synchronous };
     
    29062909    size_t m_suspendMediaPlaybackCounter { 0 };
    29072910
    2908     Optional<WebCore::PrivateClickMeasurement> m_newPageNavigationPrivateClickMeasurement;
     2911    Optional<WebCore::PrivateClickMeasurement> m_privateClickMeasurement;
    29092912};
    29102913
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r270666 r270669  
    56385638                DF84CEE2249AA21F009096F6 /* WKPDFHUDView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WKPDFHUDView.mm; path = PDF/WKPDFHUDView.mm; sourceTree = "<group>"; };
    56395639                DF84CEE3249AA21F009096F6 /* WKPDFHUDView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WKPDFHUDView.h; path = PDF/WKPDFHUDView.h; sourceTree = "<group>"; };
     5640                DF8523BA2583176F00AEADD0 /* UIKitSoftLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UIKitSoftLink.h; sourceTree = "<group>"; };
     5641                DF8523BB258317A900AEADD0 /* UIKitSoftLink.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UIKitSoftLink.mm; sourceTree = "<group>"; };
    56405642                E105FE5318D7B9DE008F57A8 /* EditingRange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditingRange.h; sourceTree = "<group>"; };
    56415643                E133FD891423DD7F00FC7BFB /* WebKit.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = WebKit.icns; path = Resources/WebKit.icns; sourceTree = "<group>"; };
     
    93059307                                A1798B4F2230A0FE000764BD /* PaymentAuthorizationController.h */,
    93069308                                A1798B502230A0FE000764BD /* PaymentAuthorizationController.mm */,
     9309                                DF8523BA2583176F00AEADD0 /* UIKitSoftLink.h */,
     9310                                DF8523BB258317A900AEADD0 /* UIKitSoftLink.mm */,
    93079311                        );
    93089312                        path = ios;
  • trunk/Tools/ChangeLog

    r270663 r270669  
     12020-12-10  Alex Christensen  <achristensen@webkit.org>
     2
     3        Accept click measurement data from hosting application
     4        https://bugs.webkit.org/show_bug.cgi?id=219763
     5        <rdar://problem/72121094>
     6
     7        Reviewed by John Wilander.
     8
     9        * TestWebKitAPI/SourcesCocoa.txt:
     10        * TestWebKitAPI/Tests/WebKitCocoa/Challenge.mm:
     11        (testCertificate):
     12        * TestWebKitAPI/Tests/WebKitCocoa/EventAttribution.mm: Added.
     13        (-[MockEventAttribution initWithReportEndpoint:attributeOn:]):
     14        (TestWebKitAPI::TEST):
     15        * TestWebKitAPI/cocoa/HTTPServer.h:
     16
    1172020-12-10  Chris Dumez  <cdumez@apple.com>
    218
  • trunk/Tools/TestWebKitAPI/SourcesCocoa.txt

    r270638 r270669  
    3434cocoa/TestWKWebView.mm
    3535
     36Tests/WebKitCocoa/EventAttribution.mm
    3637Tests/WebKitCocoa/TLSDeprecation.mm
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Challenge.mm

    r269094 r270669  
    4848static bool navigationFinished;
    4949
    50 static RetainPtr<SecCertificateRef> testCertificate()
     50RetainPtr<SecCertificateRef> testCertificate()
    5151{
    5252    auto certificateBytes = TestWebKitAPI::TCPServer::testCertificate();
  • trunk/Tools/TestWebKitAPI/cocoa/HTTPServer.h

    r266150 r270669  
    166166} // namespace TestWebKitAPI
    167167
     168RetainPtr<SecCertificateRef> testCertificate();
    168169RetainPtr<SecIdentityRef> testIdentity();
    169170RetainPtr<SecIdentityRef> testIdentity2();
Note: See TracChangeset for help on using the changeset viewer.