Changeset 244572 in webkit


Ignore:
Timestamp:
Apr 23, 2019 5:13:00 PM (5 years ago)
Author:
wilander@apple.com
Message:

Remove Ad Click Attribution data when removing website data
https://bugs.webkit.org/show_bug.cgi?id=197215
<rdar://problem/47668988>

Reviewed by Chris Dumez.

Source/WebKit:

This patch adds a new WebsiteDataType called AdClickAttributions and flags
it as owned by the network process.

The new website data type is added to the Cocoa API layer for
website data records management.

When either of the two WebsiteDataStore::removeData() functions calls
NetworkProcess::deleteWebsiteData() or
NetworkProcess::deleteWebsiteDataForOrigins() over IPC, the network
process now calls into AdClickAttributionManager::clear() and
AdClickAttributionManager::clearForRegistrableDomain() respectively,
if the website datatypes include WebsiteDataType::AdClickAttributions.

The patch removes a couple of completion handlers in NetworkSession function
calls are because those are not asynchronous.

  • NetworkProcess/AdClickAttributionManager.cpp:

(WebKit::AdClickAttributionManager::clear):
(WebKit::AdClickAttributionManager::clearForRegistrableDomain):
(WebKit::AdClickAttributionManager::toString const):

  • NetworkProcess/AdClickAttributionManager.h:
  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::deleteWebsiteData):
(WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
(WebKit::NetworkProcess::clearAdClickAttribution):

  • NetworkProcess/NetworkSession.cpp:

(WebKit::NetworkSession::clearAdClickAttribution):
(WebKit::NetworkSession::clearAdClickAttributionForRegistrableDomain):

  • NetworkProcess/NetworkSession.h:
  • Shared/WebsiteData/WebsiteData.cpp:

(WebKit::WebsiteData::ownerProcess):

  • Shared/WebsiteData/WebsiteDataType.h:
  • UIProcess/API/C/WKWebsiteDataStoreRef.cpp:

(WKWebsiteDataStoreClearAdClickAttributionsThroughWebsiteDataRemoval):

  • UIProcess/API/C/WKWebsiteDataStoreRef.h:
  • UIProcess/API/Cocoa/WKWebsiteDataRecord.mm:

(dataTypesToString):

  • UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h:

(WebKit::toWebsiteDataType):
(WebKit::toWKWebsiteDataTypes):

  • UIProcess/API/Cocoa/WKWebsiteDataRecordPrivate.h:
  • UIProcess/API/Cocoa/WKWebsiteDataStore.mm:

(+[WKWebsiteDataStore _allWebsiteDataTypesIncludingPrivate]):

Tools:

This patch adds test infrastructure to delete Ad Click Attribution data
through WebsiteDataStore::removeData().

  • WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
  • WebKitTestRunner/InjectedBundle/TestRunner.cpp:

(WTR::TestRunner::clearAdClickAttribution):
(WTR::TestRunner::clearAdClickAttributionsThroughWebsiteDataRemoval):

  • WebKitTestRunner/InjectedBundle/TestRunner.h:
  • WebKitTestRunner/TestController.cpp:

(WTR::TestController::clearAdClickAttributionsThroughWebsiteDataRemoval):

  • WebKitTestRunner/TestController.h:
  • WebKitTestRunner/TestInvocation.cpp:

(WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):

LayoutTests:

  • http/tests/adClickAttribution/clear-through-website-data-removal-expected.txt: Added.
  • http/tests/adClickAttribution/clear-through-website-data-removal.html: Added.
Location:
trunk
Files:
2 added
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r244563 r244572  
     12019-04-23  John Wilander  <wilander@apple.com>
     2
     3        Remove Ad Click Attribution data when removing website data
     4        https://bugs.webkit.org/show_bug.cgi?id=197215
     5        <rdar://problem/47668988>
     6
     7        Reviewed by Chris Dumez.
     8
     9        * http/tests/adClickAttribution/clear-through-website-data-removal-expected.txt: Added.
     10        * http/tests/adClickAttribution/clear-through-website-data-removal.html: Added.
     11
    1122019-04-23  Devin Rousso  <drousso@apple.com>
    213
  • trunk/Source/WebKit/ChangeLog

    r244570 r244572  
     12019-04-23  John Wilander  <wilander@apple.com>
     2
     3        Remove Ad Click Attribution data when removing website data
     4        https://bugs.webkit.org/show_bug.cgi?id=197215
     5        <rdar://problem/47668988>
     6
     7        Reviewed by Chris Dumez.
     8
     9        This patch adds a new WebsiteDataType called AdClickAttributions and flags
     10        it as owned by the network process.
     11
     12        The new website data type is added to the Cocoa API layer for
     13        website data records management.
     14
     15        When either of the two WebsiteDataStore::removeData() functions calls
     16        NetworkProcess::deleteWebsiteData() or
     17        NetworkProcess::deleteWebsiteDataForOrigins() over IPC, the network
     18        process now calls into AdClickAttributionManager::clear() and
     19        AdClickAttributionManager::clearForRegistrableDomain() respectively,
     20        if the website datatypes include WebsiteDataType::AdClickAttributions.
     21
     22        The patch removes a couple of completion handlers in NetworkSession function
     23        calls are because those are not asynchronous.
     24
     25        * NetworkProcess/AdClickAttributionManager.cpp:
     26        (WebKit::AdClickAttributionManager::clear):
     27        (WebKit::AdClickAttributionManager::clearForRegistrableDomain):
     28        (WebKit::AdClickAttributionManager::toString const):
     29        * NetworkProcess/AdClickAttributionManager.h:
     30        * NetworkProcess/NetworkProcess.cpp:
     31        (WebKit::NetworkProcess::deleteWebsiteData):
     32        (WebKit::NetworkProcess::deleteWebsiteDataForOrigins):
     33        (WebKit::NetworkProcess::clearAdClickAttribution):
     34        * NetworkProcess/NetworkSession.cpp:
     35        (WebKit::NetworkSession::clearAdClickAttribution):
     36        (WebKit::NetworkSession::clearAdClickAttributionForRegistrableDomain):
     37        * NetworkProcess/NetworkSession.h:
     38        * Shared/WebsiteData/WebsiteData.cpp:
     39        (WebKit::WebsiteData::ownerProcess):
     40        * Shared/WebsiteData/WebsiteDataType.h:
     41        * UIProcess/API/C/WKWebsiteDataStoreRef.cpp:
     42        (WKWebsiteDataStoreClearAdClickAttributionsThroughWebsiteDataRemoval):
     43        * UIProcess/API/C/WKWebsiteDataStoreRef.h:
     44        * UIProcess/API/Cocoa/WKWebsiteDataRecord.mm:
     45        (dataTypesToString):
     46        * UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h:
     47        (WebKit::toWebsiteDataType):
     48        (WebKit::toWKWebsiteDataTypes):
     49        * UIProcess/API/Cocoa/WKWebsiteDataRecordPrivate.h:
     50        * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
     51        (+[WKWebsiteDataStore _allWebsiteDataTypesIncludingPrivate]):
     52
    1532019-04-23  Tim Horton  <timothy_horton@apple.com>
    254
  • trunk/Source/WebKit/NetworkProcess/AdClickAttributionManager.cpp

    r244475 r244572  
    170170}
    171171
    172 void AdClickAttributionManager::clear(CompletionHandler<void()>&& completionHandler)
     172void AdClickAttributionManager::clear()
    173173{
    174174    m_firePendingConversionRequestsTimer.stop();
    175175    m_unconvertedAdClickAttributionMap.clear();
    176176    m_convertedAdClickAttributionMap.clear();
    177     completionHandler();
     177}
     178
     179void AdClickAttributionManager::clearForRegistrableDomain(const RegistrableDomain& domain)
     180{
     181    m_unconvertedAdClickAttributionMap.removeIf([&domain](auto& keyAndValue) {
     182        return keyAndValue.key.first.registrableDomain == domain || keyAndValue.key.second.registrableDomain == domain;
     183    });
     184
     185    m_convertedAdClickAttributionMap.removeIf([&domain](auto& keyAndValue) {
     186        return keyAndValue.key.first.registrableDomain == domain || keyAndValue.key.second.registrableDomain == domain;
     187    });
    178188}
    179189
     
    198208    unsigned convertedAttributionNumber = 0;
    199209    for (auto& attribution : m_convertedAdClickAttributionMap.values()) {
     210        if (unconvertedAttributionNumber)
     211            builder.append('\n');
    200212        if (!convertedAttributionNumber)
    201213            builder.appendLiteral("Converted Ad Click Attributions:\n");
  • trunk/Source/WebKit/NetworkProcess/AdClickAttributionManager.h

    r244402 r244572  
    5858    void storeUnconverted(AdClickAttribution&&);
    5959    void convert(const Source&, const Destination&, Conversion&&);
    60     void clear(CompletionHandler<void()>&&);
     60    void clear();
     61    void clearForRegistrableDomain(const RegistrableDomain&);
    6162    void toString(CompletionHandler<void(String)>&&) const;
    6263    void setPingLoadFunction(Function<void(NetworkResourceLoadParameters&&, CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)>&&)>&& pingLoadFunction) { m_pingLoadFunction = WTFMove(pingLoadFunction); }
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r244521 r244572  
    14261426    if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) || websiteDataTypes.contains(WebsiteDataType::DOMCache))
    14271427        clearStorageQuota(sessionID);
     1428
     1429    if (websiteDataTypes.contains(WebsiteDataType::AdClickAttributions)) {
     1430        if (auto* networkSession = this->networkSession(sessionID))
     1431            networkSession->clearAdClickAttribution();
     1432    }
    14281433}
    14291434
     
    14661471#endif
    14671472
     1473    if (websiteDataTypes.contains(WebsiteDataType::AdClickAttributions)) {
     1474        if (auto* networkSession = this->networkSession(sessionID)) {
     1475            for (auto& originData : originDatas)
     1476                networkSession->clearAdClickAttributionForRegistrableDomain(RegistrableDomain::uncheckedCreateFromHost(originData.host));
     1477        }
     1478    }
     1479   
    14681480    auto clearTasksHandler = WTF::CallbackAggregator::create([this, callbackID] {
    14691481        parentProcessConnection()->send(Messages::NetworkProcessProxy::DidDeleteWebsiteDataForOrigins(callbackID), 0);
     
    25162528{
    25172529    if (auto* session = networkSession(sessionID))
    2518         return session->clearAdClickAttribution(WTFMove(completionHandler));
     2530        session->clearAdClickAttribution();
    25192531   
    25202532    completionHandler();
  • trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp

    r244402 r244572  
    159159}
    160160
    161 void NetworkSession::clearAdClickAttribution(CompletionHandler<void()>&& completionHandler)
     161void NetworkSession::clearAdClickAttribution()
    162162{
    163     m_adClickAttribution->clear(WTFMove(completionHandler));
     163    m_adClickAttribution->clear();
     164}
     165
     166void NetworkSession::clearAdClickAttributionForRegistrableDomain(WebCore::RegistrableDomain&& domain)
     167{
     168    m_adClickAttribution->clearForRegistrableDomain(WTFMove(domain));
    164169}
    165170
  • trunk/Source/WebKit/NetworkProcess/NetworkSession.h

    r244288 r244572  
    8383    void convertAdClickAttribution(const WebCore::AdClickAttribution::Source&, const WebCore::AdClickAttribution::Destination&, WebCore::AdClickAttribution::Conversion&&);
    8484    void dumpAdClickAttribution(CompletionHandler<void(String)>&&);
    85     void clearAdClickAttribution(CompletionHandler<void()>&&);
     85    void clearAdClickAttribution();
     86    void clearAdClickAttributionForRegistrableDomain(WebCore::RegistrableDomain&&);
    8687    void setAdClickAttributionOverrideTimerForTesting(bool value);
    8788    void setAdClickAttributionConversionURLForTesting(URL&&);
  • trunk/Source/WebKit/Shared/WebsiteData/WebsiteData.cpp

    r243902 r244572  
    129129    case WebsiteDataType::DeviceIdHashSalt:
    130130        return WebsiteDataProcessType::UI;
     131    case WebsiteDataType::AdClickAttributions:
     132        return WebsiteDataProcessType::Network;
    131133    }
    132134
  • trunk/Source/WebKit/Shared/WebsiteData/WebsiteDataType.h

    r237031 r244572  
    5151    DOMCache = 1 << 15,
    5252    DeviceIdHashSalt = 1 << 16,
     53    AdClickAttributions = 1 << 17,
    5354};
    5455
  • trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.cpp

    r244382 r244572  
    659659#endif
    660660}
     661
     662void WKWebsiteDataStoreClearAdClickAttributionsThroughWebsiteDataRemoval(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreClearAdClickAttributionsThroughWebsiteDataRemovalFunction callback)
     663{
     664    OptionSet<WebKit::WebsiteDataType> dataTypes = WebKit::WebsiteDataType::AdClickAttributions;
     665    WebKit::toImpl(dataStoreRef)->websiteDataStore().removeData(dataTypes, WallTime::fromRawSeconds(0), [context, callback] {
     666        callback(context);
     667    });
     668}
     669
  • trunk/Source/WebKit/UIProcess/API/C/WKWebsiteDataStoreRef.h

    r244382 r244572  
    132132WK_EXPORT void WKWebsiteDataStoreClearAllDeviceOrientationPermissions(WKWebsiteDataStoreRef dataStoreRef);
    133133
     134typedef void (*WKWebsiteDataStoreClearAdClickAttributionsThroughWebsiteDataRemovalFunction)(void* functionContext);
     135WK_EXPORT void WKWebsiteDataStoreClearAdClickAttributionsThroughWebsiteDataRemoval(WKWebsiteDataStoreRef dataStoreRef, void* context, WKWebsiteDataStoreClearAdClickAttributionsThroughWebsiteDataRemovalFunction callback);
     136
    134137#ifdef __cplusplus
    135138}
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataRecord.mm

    r242339 r244572  
    4949NSString * const _WKWebsiteDataTypeResourceLoadStatistics = @"_WKWebsiteDataTypeResourceLoadStatistics";
    5050NSString * const _WKWebsiteDataTypeCredentials = @"_WKWebsiteDataTypeCredentials";
     51NSString * const _WKWebsiteDataTypeAdClickAttributions = @"_WKWebsiteDataTypeAdClickAttributions";
    5152
    5253#if PLATFORM(MAC)
     
    101102    if ([dataTypes containsObject:_WKWebsiteDataTypeCredentials])
    102103        [array addObject:@"Credentials"];
     104    if ([dataTypes containsObject:_WKWebsiteDataTypeAdClickAttributions])
     105        [array addObject:@"Ad Click Attributions"];
    103106
    104107    return [array componentsJoinedByString:@", "];
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataRecordInternal.h

    r242339 r244572  
    7575    if ([websiteDataType isEqualToString:_WKWebsiteDataTypeCredentials])
    7676        return WebsiteDataType::Credentials;
     77    if ([websiteDataType isEqualToString:_WKWebsiteDataTypeAdClickAttributions])
     78        return WebsiteDataType::AdClickAttributions;
    7779    return WTF::nullopt;
    7880}
     
    130132    if (websiteDataTypes.contains(WebsiteDataType::Credentials))
    131133        [wkWebsiteDataTypes addObject:_WKWebsiteDataTypeCredentials];
     134    if (websiteDataTypes.contains(WebsiteDataType::AdClickAttributions))
     135        [wkWebsiteDataTypes addObject:_WKWebsiteDataTypeAdClickAttributions];
    132136
    133137    return wkWebsiteDataTypes;
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataRecordPrivate.h

    r243376 r244572  
    3535WK_EXTERN NSString * const _WKWebsiteDataTypeResourceLoadStatistics WK_API_AVAILABLE(macos(10.12), ios(10.0));
    3636WK_EXTERN NSString * const _WKWebsiteDataTypeCredentials WK_API_AVAILABLE(macos(10.13), ios(11.0));
     37WK_EXTERN NSString * const _WKWebsiteDataTypeAdClickAttributions WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    3738
    3839
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm

    r243911 r244572  
    203203    static NSSet *allWebsiteDataTypes;
    204204    dispatch_once(&onceToken, ^ {
    205         auto *privateTypes = @[_WKWebsiteDataTypeHSTSCache, _WKWebsiteDataTypeMediaKeys, _WKWebsiteDataTypeSearchFieldRecentSearches, _WKWebsiteDataTypeResourceLoadStatistics, _WKWebsiteDataTypeCredentials
     205        auto *privateTypes = @[_WKWebsiteDataTypeHSTSCache, _WKWebsiteDataTypeMediaKeys, _WKWebsiteDataTypeSearchFieldRecentSearches, _WKWebsiteDataTypeResourceLoadStatistics, _WKWebsiteDataTypeCredentials, _WKWebsiteDataTypeAdClickAttributions
    206206#if !TARGET_OS_IPHONE
    207207        , _WKWebsiteDataTypePlugInData
  • trunk/Tools/ChangeLog

    r244571 r244572  
     12019-04-23  John Wilander  <wilander@apple.com>
     2
     3        Remove Ad Click Attribution data when removing website data
     4        https://bugs.webkit.org/show_bug.cgi?id=197215
     5        <rdar://problem/47668988>
     6
     7        Reviewed by Chris Dumez.
     8
     9        This patch adds test infrastructure to delete Ad Click Attribution data
     10        through WebsiteDataStore::removeData().
     11
     12        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
     13        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
     14        (WTR::TestRunner::clearAdClickAttribution):
     15        (WTR::TestRunner::clearAdClickAttributionsThroughWebsiteDataRemoval):
     16        * WebKitTestRunner/InjectedBundle/TestRunner.h:
     17        * WebKitTestRunner/TestController.cpp:
     18        (WTR::TestController::clearAdClickAttributionsThroughWebsiteDataRemoval):
     19        * WebKitTestRunner/TestController.h:
     20        * WebKitTestRunner/TestInvocation.cpp:
     21        (WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):
     22
    1232019-04-23  Jonathan Bedard  <jbedard@apple.com>
    224
  • trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl

    r244557 r244572  
    387387    // Ad Click Attribution
    388388    void clearAdClickAttribution();
     389    void clearAdClickAttributionsThroughWebsiteDataRemoval();
    389390    void setAdClickAttributionOverrideTimerForTesting(boolean value);
    390391    void setAdClickAttributionConversionURLForTesting(DOMString url);
  • trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp

    r244565 r244572  
    28772877}
    28782878
     2879void TestRunner::clearAdClickAttributionsThroughWebsiteDataRemoval()
     2880{
     2881    auto messageName = adoptWK(WKStringCreateWithUTF8CString("ClearAdClickAttributionsThroughWebsiteDataRemoval"));
     2882    WKBundlePostSynchronousMessage(InjectedBundle::singleton().bundle(), messageName.get(), nullptr, nullptr);
     2883}
     2884
    28792885void TestRunner::setAdClickAttributionOverrideTimerForTesting(bool value)
    28802886{
  • trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h

    r244557 r244572  
    501501    void dumpAdClickAttribution();
    502502    void clearAdClickAttribution();
     503    void clearAdClickAttributionsThroughWebsiteDataRemoval();
    503504    void setAdClickAttributionOverrideTimerForTesting(bool value);
    504505    void setAdClickAttributionConversionURLForTesting(JSStringRef);
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r244557 r244572  
    36063606}
    36073607
     3608void TestController::clearAdClickAttributionsThroughWebsiteDataRemoval()
     3609{
     3610    auto* dataStore = WKContextGetWebsiteDataStore(platformContext());
     3611    AdClickAttributionVoidCallbackContext callbackContext(*this);
     3612    WKWebsiteDataStoreClearAdClickAttributionsThroughWebsiteDataRemoval(dataStore, &callbackContext, adClickAttributionVoidCallback);
     3613    runUntil(callbackContext.done, noTimeout);
     3614}
     3615
    36083616void TestController::setAdClickAttributionOverrideTimerForTesting(bool value)
    36093617{
  • trunk/Tools/WebKitTestRunner/TestController.h

    r244557 r244572  
    315315    String dumpAdClickAttribution();
    316316    void clearAdClickAttribution();
     317    void clearAdClickAttributionsThroughWebsiteDataRemoval();
    317318    void setAdClickAttributionOverrideTimerForTesting(bool value);
    318319    void setAdClickAttributionConversionURLForTesting(WKURLRef);
  • trunk/Tools/WebKitTestRunner/TestInvocation.cpp

    r244557 r244572  
    16441644        return nullptr;
    16451645    }
    1646    
     1646
     1647    if (WKStringIsEqualToUTF8CString(messageName, "ClearAdClickAttributionsThroughWebsiteDataRemoval")) {
     1648        TestController::singleton().clearAdClickAttributionsThroughWebsiteDataRemoval();
     1649        return nullptr;
     1650    }
     1651
    16471652    if (WKStringIsEqualToUTF8CString(messageName, "SetAdClickAttributionOverrideTimerForTesting")) {
    16481653        ASSERT(WKGetTypeID(messageBody) == WKBooleanGetTypeID());
Note: See TracChangeset for help on using the changeset viewer.