WebKit Bugzilla
Attachment 368509 Details for
Bug 197332
: Add logging of Ad Click Attribution errors and events to a dedicated channel
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-197332-20190429161908.patch (text/plain), 21.82 KB, created by
John Wilander
on 2019-04-29 16:19:09 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
John Wilander
Created:
2019-04-29 16:19:09 PDT
Size:
21.82 KB
patch
obsolete
>Subversion Revision: 244756 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index f1044ee448837df865d569e12e4f2b8f3bd35466..54dc4b65330fa0a36eb37dd5e23f0012b213418e 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,20 @@ >+2019-04-29 John Wilander <wilander@apple.com> >+ >+ Add logging of Ad Click Attribution errors and events to a dedicated channel >+ https://bugs.webkit.org/show_bug.cgi?id=197332 >+ <rdar://problem/49918800> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ This patch adds an experimental Ad Click Attribution debug mode which >+ logs information. >+ >+ No new tests. >+ >+ * page/RuntimeEnabledFeatures.h: >+ (WebCore::RuntimeEnabledFeatures::adClickAttributionDebugModeEnabled const): >+ (WebCore::RuntimeEnabledFeatures::setAdClickAttributionDebugModeEnabled): >+ > 2019-04-29 Alex Christensen <achristensen@webkit.org> > > <rdar://problem/50299396> Fix internal High Sierra build >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 94f9865af63e09a158191ac41bdbc85f0cc521e9..4a52cfd473aee392c5692b7096fc707023f6c41a 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,46 @@ >+2019-04-29 John Wilander <wilander@apple.com> >+ >+ Add logging of Ad Click Attribution errors and events to a dedicated channel >+ https://bugs.webkit.org/show_bug.cgi?id=197332 >+ <rdar://problem/49918800> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ This patch adds an experimental Ad Click Attribution debug mode which >+ logs information. Most changes are just log output in the various >+ functions in WebKit::AdClickAttributionManager. >+ >+ The constructor to WebKit::AdClickAttributionManager now takes a >+ PAL::SessionID so that the log functions can make sure they don't >+ output anything in ephemeral sessions. >+ >+ WebProcessPool::platformInitializeNetworkProcess() now picks up the >+ debug mode setting from the incoming >+ WebKit::NetworkProcessCreationParameters object. >+ >+ * NetworkProcess/AdClickAttributionManager.cpp: >+ (WebKit::AdClickAttributionManager::storeUnconverted): >+ (WebKit::AdClickAttributionManager::convert): >+ (WebKit::AdClickAttributionManager::fireConversionRequest): >+ (WebKit::AdClickAttributionManager::firePendingConversionRequests): >+ (WebKit::AdClickAttributionManager::clearExpired): >+ (WebKit::AdClickAttributionManager::debugModeEnabled const): >+ * NetworkProcess/AdClickAttributionManager.h: >+ (WebKit::AdClickAttributionManager::AdClickAttributionManager): >+ (WebKit::AdClickAttributionManager::m_sessionID): >+ * NetworkProcess/NetworkProcess.cpp: >+ (WebKit::NetworkProcess::initializeNetworkProcess): >+ * NetworkProcess/NetworkProcessCreationParameters.cpp: >+ (WebKit::NetworkProcessCreationParameters::encode const): >+ (WebKit::NetworkProcessCreationParameters::decode): >+ * NetworkProcess/NetworkProcessCreationParameters.h: >+ * NetworkProcess/NetworkSession.cpp: >+ (WebKit::NetworkSession::NetworkSession): >+ * Platform/Logging.h: >+ * Shared/WebPreferences.yaml: >+ * UIProcess/Cocoa/WebProcessPoolCocoa.mm: >+ (WebKit::WebProcessPool::platformInitializeNetworkProcess): >+ > 2019-04-29 Alex Christensen <achristensen@webkit.org> > > <rdar://problem/50299396> Fix internal High Sierra build >diff --git a/Source/WebCore/page/RuntimeEnabledFeatures.h b/Source/WebCore/page/RuntimeEnabledFeatures.h >index c61c8fd197f672e97ab43001f388670402cea19e..86545a54c92e84e27237d21368166bdba3bb4c35 100644 >--- a/Source/WebCore/page/RuntimeEnabledFeatures.h >+++ b/Source/WebCore/page/RuntimeEnabledFeatures.h >@@ -341,6 +341,8 @@ public: > > bool adClickAttributionEnabled() const { return m_adClickAttributionEnabled; } > void setAdClickAttributionEnabled(bool isEnabled) { m_adClickAttributionEnabled = isEnabled; } >+ bool adClickAttributionDebugModeEnabled() const { return m_adClickAttributionDebugModeEnabled; } >+ void setAdClickAttributionDebugModeEnabled(bool isEnabled) { m_adClickAttributionDebugModeEnabled = isEnabled; } > > #if ENABLE(TOUCH_EVENTS) > bool mouseEventsSimulationEnabled() const { return m_mouseEventsSimulationEnabled; } >@@ -525,6 +527,7 @@ private: > bool m_CSSLogicalEnabled { false }; > > bool m_adClickAttributionEnabled { false }; >+ bool m_adClickAttributionDebugModeEnabled { false }; > > #if ENABLE(TOUCH_EVENTS) > bool m_mouseEventsSimulationEnabled { false }; >diff --git a/Source/WebKit/NetworkProcess/AdClickAttributionManager.cpp b/Source/WebKit/NetworkProcess/AdClickAttributionManager.cpp >index 08b00fb9262396fbc41f60441fa507140aa8987b..e9745d01b5d2687ae8f3d3a7272ed087f076a31c 100644 >--- a/Source/WebKit/NetworkProcess/AdClickAttributionManager.cpp >+++ b/Source/WebKit/NetworkProcess/AdClickAttributionManager.cpp >@@ -26,12 +26,14 @@ > #include "config.h" > #include "AdClickAttributionManager.h" > >+#include "Logging.h" > #include <WebCore/FetchOptions.h> > #include <WebCore/FormData.h> > #include <WebCore/ResourceError.h> > #include <WebCore/ResourceRequest.h> > #include <WebCore/ResourceResponse.h> > #include <WebCore/RuntimeApplicationChecks.h> >+#include <WebCore/RuntimeEnabledFeatures.h> > #include <wtf/text/StringBuilder.h> > #include <wtf/text/StringHash.h> > >@@ -43,10 +45,15 @@ using Destination = AdClickAttribution::Destination; > using DestinationMap = HashMap<Destination, AdClickAttribution>; > using Conversion = AdClickAttribution::Conversion; > >+constexpr Seconds debugModeSecondsUntilSend { 60_s }; >+ > void AdClickAttributionManager::storeUnconverted(AdClickAttribution&& attribution) > { > clearExpired(); >- >+ >+#if !RELEASE_LOG_DISABLED >+ RELEASE_LOG_INFO_IF(debugModeEnabled(), AdClickAttribution, "Storing an ad click from source: %{public}s to destination: %{public}s.", attribution.source().registrableDomain.string().utf8().data(), attribution.destination().registrableDomain.string().utf8().data()); >+#endif > m_unconvertedAdClickAttributionMap.set(std::make_pair(attribution.source(), attribution.destination()), WTFMove(attribution)); > } > >@@ -59,8 +66,19 @@ void AdClickAttributionManager::convert(const Source& source, const Destination& > { > clearExpired(); > >- if (!conversion.isValid()) >+ if (!conversion.isValid()) { >+#if !RELEASE_LOG_DISABLED >+ RELEASE_LOG_INFO_IF(debugModeEnabled(), AdClickAttribution, "Got an invalid conversion."); >+#endif > return; >+ } >+ >+ auto conversionData = conversion.data; >+ auto conversionPriority = conversion.priority; >+ >+#if !RELEASE_LOG_DISABLED >+ RELEASE_LOG_INFO_IF(debugModeEnabled(), AdClickAttribution, "Got a conversion for source: %{public}s and destination: %{public}s with conversion data: %{public}u and priority: %{public}u.", source.registrableDomain.string().utf8().data(), destination.registrableDomain.string().utf8().data(), conversionData, conversionPriority); >+#endif > > auto secondsUntilSend = Seconds::infinity(); > >@@ -73,17 +91,28 @@ void AdClickAttributionManager::convert(const Source& source, const Destination& > if (auto optionalSecondsUntilSend = previouslyUnconvertedAttribution.convertAndGetEarliestTimeToSend(WTFMove(conversion))) { > secondsUntilSend = *optionalSecondsUntilSend; > ASSERT(secondsUntilSend != Seconds::infinity()); >+#if !RELEASE_LOG_DISABLED >+ RELEASE_LOG_INFO_IF(debugModeEnabled(), AdClickAttribution, "Converted a stored ad click for source: %{public}s and destination: %{public}s with conversion data: %{public}u and priority: %{public}u.", source.registrableDomain.string().utf8().data(), destination.registrableDomain.string().utf8().data(), conversionData, conversionPriority); >+#endif > } >- // If there is no previously converted attribution for this pair, add the new one. >- // If the newly converted attribution has higher priority, replace the old one. >- if (previouslyConvertedAttributionIter == m_convertedAdClickAttributionMap.end() >- || previouslyUnconvertedAttribution.hasHigherPriorityThan(previouslyConvertedAttributionIter->value)) >+ >+ if (previouslyConvertedAttributionIter == m_convertedAdClickAttributionMap.end()) >+ m_convertedAdClickAttributionMap.add(pair, WTFMove(previouslyUnconvertedAttribution)); >+ else if (previouslyUnconvertedAttribution.hasHigherPriorityThan(previouslyConvertedAttributionIter->value)) { >+ // If the newly converted attribution has higher priority, replace the old one. > m_convertedAdClickAttributionMap.set(pair, WTFMove(previouslyUnconvertedAttribution)); >+#if !RELEASE_LOG_DISABLED >+ RELEASE_LOG_INFO_IF(debugModeEnabled(), AdClickAttribution, "Replaced a previously converted ad click for source: %{public}s and destination: %{public}s with a new one with conversion data: %{public}u and priority: %{public}u because it had higher priority.", source.registrableDomain.string().utf8().data(), destination.registrableDomain.string().utf8().data(), conversionData, conversionPriority); >+#endif >+ } > } else if (previouslyConvertedAttributionIter != m_convertedAdClickAttributionMap.end()) { > // If we have no newly converted attribution, re-convert the old one to respect the new priority. > if (auto optionalSecondsUntilSend = previouslyConvertedAttributionIter->value.convertAndGetEarliestTimeToSend(WTFMove(conversion))) { > secondsUntilSend = *optionalSecondsUntilSend; > ASSERT(secondsUntilSend != Seconds::infinity()); >+#if !RELEASE_LOG_DISABLED >+ RELEASE_LOG_INFO_IF(debugModeEnabled(), AdClickAttribution, "Re-converted an ad click for source: %{public}s and destination: %{public}s with a new one with conversion data: %{public}u and priority: %{public}u because it had higher priority.", source.registrableDomain.string().utf8().data(), destination.registrableDomain.string().utf8().data(), conversionData, conversionPriority); >+#endif > } > } > >@@ -92,7 +121,14 @@ void AdClickAttributionManager::convert(const Source& source, const Destination& > > if (m_firePendingConversionRequestsTimer.isActive() && m_firePendingConversionRequestsTimer.nextFireInterval() < secondsUntilSend) > return; >- >+ >+ if (debugModeEnabled()) { >+#if !RELEASE_LOG_DISABLED >+ RELEASE_LOG_INFO(AdClickAttribution, "Setting timer for firing conversion requests to the debug mode timeout of %{public}f seconds where the regular timeout would have been %{public}f seconds.", debugModeSecondsUntilSend.seconds(), secondsUntilSend.seconds()); >+#endif >+ secondsUntilSend = debugModeSecondsUntilSend; >+ } >+ > startTimer(secondsUntilSend); > } > >@@ -133,10 +169,17 @@ void AdClickAttributionManager::fireConversionRequest(const AdClickAttribution& > loadParameters.mainDocumentURL = WTFMove(conversionReferrerURL); > #endif > >- m_pingLoadFunction(WTFMove(loadParameters), [](const WebCore::ResourceError& error, const WebCore::ResourceResponse& response) { >- // FIXME: Add logging of errors to a dedicated channel. >- UNUSED_PARAM(response); >+#if !RELEASE_LOG_DISABLED >+ RELEASE_LOG_INFO_IF(debugModeEnabled(), AdClickAttribution, "About to fire an attribution request for a conversion with source: %{public}s and destination: %{public}s.", attribution.source().registrableDomain.string().utf8().data(), attribution.destination().registrableDomain.string().utf8().data()); >+#endif >+ >+ m_pingLoadFunction(WTFMove(loadParameters), [this, weakThis = makeWeakPtr(*this), sourceStr = attribution.source().registrableDomain.string(), destinationStr = attribution.destination().registrableDomain.string()](const WebCore::ResourceError& error, const WebCore::ResourceResponse& response) { >+#if !RELEASE_LOG_DISABLED >+ RELEASE_LOG_INFO_IF(weakThis && debugModeEnabled() && !error.isNull(), AdClickAttribution, "Received error: '%{public}s' for attribution request with source: %{public}s and destination: %{public}s.", error.localizedDescription().utf8().data(), sourceStr.utf8().data(), destinationStr.utf8().data()); >+#else > UNUSED_PARAM(error); >+#endif >+ UNUSED_PARAM(response); > }); > } > >@@ -155,7 +198,7 @@ void AdClickAttributionManager::firePendingConversionRequests() > } > > auto now = WallTime::now(); >- if (*earliestTimeToSend <= now || m_isRunningTest) { >+ if (*earliestTimeToSend <= now || m_isRunningTest || debugModeEnabled()) { > fireConversionRequest(attribution); > attribution.markConversionAsSent(); > continue; >@@ -193,8 +236,13 @@ void AdClickAttributionManager::clearForRegistrableDomain(const RegistrableDomai > > void AdClickAttributionManager::clearExpired() > { >- m_unconvertedAdClickAttributionMap.removeIf([](auto& keyAndValue) { >- return keyAndValue.value.hasExpired(); >+ m_unconvertedAdClickAttributionMap.removeIf([this, weakThis = makeWeakPtr(*this)](auto& keyAndValue) { >+ auto hasExpired = keyAndValue.value.hasExpired(); >+ if (hasExpired) >+#if !RELEASE_LOG_DISABLED >+ RELEASE_LOG_INFO_IF(weakThis && debugModeEnabled(), AdClickAttribution, "Removing expired ad click from source: %{public}s to destination: %{public}s.", keyAndValue.value.source().registrableDomain.string().utf8().data(), keyAndValue.value.destination().registrableDomain.string().utf8().data()); >+#endif >+ return hasExpired; > }); > } > >@@ -247,4 +295,9 @@ void AdClickAttributionManager::markAllUnconvertedAsExpiredForTesting() > attribution.markAsExpired(); > } > >+bool AdClickAttributionManager::debugModeEnabled() const >+{ >+ return RuntimeEnabledFeatures::sharedFeatures().adClickAttributionDebugModeEnabled() && !m_sessionID.isEphemeral(); >+} >+ > } // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/AdClickAttributionManager.h b/Source/WebKit/NetworkProcess/AdClickAttributionManager.h >index 250748c058455999e7291b09811cdea7df79db7e..ecc519903580748465173e9a2c9b2b7cc75a4304 100644 >--- a/Source/WebKit/NetworkProcess/AdClickAttributionManager.h >+++ b/Source/WebKit/NetworkProcess/AdClickAttributionManager.h >@@ -33,11 +33,12 @@ > #include <WebCore/Timer.h> > #include <wtf/CompletionHandler.h> > #include <wtf/HashMap.h> >+#include <wtf/WeakPtr.h> > #include <wtf/text/WTFString.h> > > namespace WebKit { > >-class AdClickAttributionManager { >+class AdClickAttributionManager : public CanMakeWeakPtr<AdClickAttributionManager> { > public: > > using RegistrableDomain = WebCore::RegistrableDomain; >@@ -46,12 +47,13 @@ public: > using Destination = WebCore::AdClickAttribution::Destination; > using Conversion = WebCore::AdClickAttribution::Conversion; > >- AdClickAttributionManager() >+ AdClickAttributionManager(PAL::SessionID sessionID) > : m_firePendingConversionRequestsTimer(*this, &AdClickAttributionManager::firePendingConversionRequests) > , m_pingLoadFunction([](NetworkResourceLoadParameters&& params, CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)>&& completionHandler) { > UNUSED_PARAM(params); > completionHandler(WebCore::ResourceError(), WebCore::ResourceResponse()); > }) >+ , m_sessionID(sessionID) > { > } > >@@ -70,6 +72,7 @@ private: > void fireConversionRequest(const AdClickAttribution&); > void firePendingConversionRequests(); > void clearExpired(); >+ bool debugModeEnabled() const; > > HashMap<std::pair<Source, Destination>, AdClickAttribution> m_unconvertedAdClickAttributionMap; > HashMap<std::pair<Source, Destination>, AdClickAttribution> m_convertedAdClickAttributionMap; >@@ -77,6 +80,7 @@ private: > Function<void(NetworkResourceLoadParameters&&, CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)>&&)> m_pingLoadFunction; > bool m_isRunningTest { false }; > Optional<URL> m_conversionBaseURLForTesting; >+ PAL::SessionID m_sessionID; > }; > > } // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/NetworkProcess.cpp b/Source/WebKit/NetworkProcess/NetworkProcess.cpp >index 69226f0063ba4e37afbac685f92067ce67854b59..6ea9e226d896c094a0c863d2465aea2806878d8f 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcess.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkProcess.cpp >@@ -306,6 +306,8 @@ void NetworkProcess::initializeNetworkProcess(NetworkProcessCreationParameters&& > WebCore::RuntimeEnabledFeatures::sharedFeatures().setIsITPDatabaseEnabled(parameters.shouldEnableITPDatabase); > WebCore::RuntimeEnabledFeatures::sharedFeatures().setIsITPFirstPartyWebsiteDataRemovalEnabled(parameters.isITPFirstPartyWebsiteDataRemovalEnabled); > >+ WebCore::RuntimeEnabledFeatures::sharedFeatures().setAdClickAttributionDebugModeEnabled(parameters.enableAdClickAttributionDebugMode); >+ > SandboxExtension::consumePermanently(parameters.defaultDataStoreParameters.networkSessionParameters.resourceLoadStatisticsDirectoryExtensionHandle); > > auto sessionID = parameters.defaultDataStoreParameters.networkSessionParameters.sessionID; >diff --git a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp >index ed319975d86d53ceca78ff563848622bbddf5f50..40593199ae4353bf1601699bd5ce12c0827a6c0d 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.cpp >@@ -91,6 +91,7 @@ void NetworkProcessCreationParameters::encode(IPC::Encoder& encoder) const > encoder << shouldEnableITPDatabase; > encoder << downloadMonitorSpeedMultiplier; > encoder << isITPFirstPartyWebsiteDataRemovalEnabled; >+ encoder << enableAdClickAttributionDebugMode; > } > > bool NetworkProcessCreationParameters::decode(IPC::Decoder& decoder, NetworkProcessCreationParameters& result) >@@ -220,6 +221,9 @@ bool NetworkProcessCreationParameters::decode(IPC::Decoder& decoder, NetworkProc > if (!decoder.decode(result.isITPFirstPartyWebsiteDataRemovalEnabled)) > return false; > >+ if (!decoder.decode(result.enableAdClickAttributionDebugMode)) >+ return false; >+ > return true; > } > >diff --git a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h >index 0f1f4407107e8d3368f320326cf7c9e410b3b2c4..203be69ddac0160a63901faeeed3d3ec3794c829 100644 >--- a/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h >+++ b/Source/WebKit/NetworkProcess/NetworkProcessCreationParameters.h >@@ -109,6 +109,7 @@ struct NetworkProcessCreationParameters { > bool shouldEnableITPDatabase { false }; > bool isITPFirstPartyWebsiteDataRemovalEnabled { true }; > uint32_t downloadMonitorSpeedMultiplier { 1 }; >+ bool enableAdClickAttributionDebugMode { false }; > }; > > } // namespace WebKit >diff --git a/Source/WebKit/NetworkProcess/NetworkSession.cpp b/Source/WebKit/NetworkProcess/NetworkSession.cpp >index 5b442bf282f15cb2e99bb28490772f08fdb97141..f01c41f99479f77e87dedf7802a82653383b970c 100644 >--- a/Source/WebKit/NetworkProcess/NetworkSession.cpp >+++ b/Source/WebKit/NetworkProcess/NetworkSession.cpp >@@ -74,7 +74,7 @@ NetworkStorageSession& NetworkSession::networkStorageSession() const > NetworkSession::NetworkSession(NetworkProcess& networkProcess, PAL::SessionID sessionID) > : m_sessionID(sessionID) > , m_networkProcess(networkProcess) >- , m_adClickAttribution(makeUniqueRef<AdClickAttributionManager>()) >+ , m_adClickAttribution(makeUniqueRef<AdClickAttributionManager>(sessionID)) > { > m_adClickAttribution->setPingLoadFunction([this, weakThis = makeWeakPtr(this)](NetworkResourceLoadParameters&& loadParameters, CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&)>&& completionHandler) { > if (!weakThis) >diff --git a/Source/WebKit/Platform/Logging.h b/Source/WebKit/Platform/Logging.h >index 4c5cc67441f2b01ba49eadab4d41f3e9081f897d..9d5a42d34f02dd29accca043614ab89cd0d1afb6 100644 >--- a/Source/WebKit/Platform/Logging.h >+++ b/Source/WebKit/Platform/Logging.h >@@ -40,6 +40,7 @@ extern "C" { > #endif > > #define WEBKIT2_LOG_CHANNELS(M) \ >+ M(AdClickAttribution) \ > M(Automation) \ > M(ActivityState) \ > M(BackForward) \ >diff --git a/Source/WebKit/Shared/WebPreferences.yaml b/Source/WebKit/Shared/WebPreferences.yaml >index ff9da3b51ae89d7bf38f5f9cd8116fb81b711c1c..c4fccfcf18b6b5e2e5fd461622d3f5532a0ec7ef 100644 >--- a/Source/WebKit/Shared/WebPreferences.yaml >+++ b/Source/WebKit/Shared/WebPreferences.yaml >@@ -1412,6 +1412,14 @@ AdClickAttributionEnabled: > webcoreBinding: RuntimeEnabledFeatures > category: experimental > >+AdClickAttributionDebugModeEnabled: >+ type: bool >+ defaultValue: false >+ humanReadableName: "Ad Click Attribution Debug Mode" >+ humanReadableDescription: "Enable Ad Click Attribution Debug Mode" >+ webcoreBinding: RuntimeEnabledFeatures >+ category: experimental >+ > # For internal features: > # The type should be boolean. > # You must provide a humanReadableName and humanReadableDescription for all debug features. They >diff --git a/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm b/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm >index ef92bad356359c4fdec1ffc3a7dad81820b25f4b..807632ff57c963eedf50bcbb59c23c27d1af386b 100644 >--- a/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm >+++ b/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm >@@ -304,6 +304,8 @@ void WebProcessPool::platformInitializeNetworkProcess(NetworkProcessCreationPara > auto isITPFirstPartyWebsiteDataRemovalEnabledStr = [defaults stringForKey:[NSString stringWithFormat:@"Experimental%@", WebPreferencesKey::isITPFirstPartyWebsiteDataRemovalEnabledKey().createCFString().get()]]; > if ([isITPFirstPartyWebsiteDataRemovalEnabledStr isEqual:@"0"]) > parameters.isITPFirstPartyWebsiteDataRemovalEnabled = false; >+ >+ parameters.enableAdClickAttributionDebugMode = [defaults boolForKey:[NSString stringWithFormat:@"Experimental%@", WebPreferencesKey::adClickAttributionDebugModeEnabledKey().createCFString().get()]]; > } > > void WebProcessPool::platformInvalidateContext()
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 197332
:
368365
|
368371
|
368375
|
368386
|
368509
|
368576
|
368585
|
368588
|
368589
|
368645