WebKit Bugzilla
Attachment 360361 Details for
Bug 193916
: Add data abstraction and validation for Ad Click Attribution
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-193916-20190128114059.patch (text/plain), 26.10 KB, created by
John Wilander
on 2019-01-28 11:41:00 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
John Wilander
Created:
2019-01-28 11:41:00 PST
Size:
26.10 KB
patch
obsolete
>Subversion Revision: 240444 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 07430bdba832a1860e1ece720935bef3343d5b40..021f6eece02e01fe9bdc4de7b543684a6eb9774a 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,30 @@ >+2019-01-28 John Wilander <wilander@apple.com> >+ >+ Add data abstraction and validation for Ad Click Attribution >+ https://bugs.webkit.org/show_bug.cgi?id=193916 >+ <rdar://problem/47603481> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ New API tests added. >+ >+ * WebCore.xcodeproj/project.pbxproj: >+ * loader/AdClickAttribution.cpp: Added. >+ (WebCore::isMaxSixBits): >+ (WebCore::AdClickAttribution::isValid): >+ (WebCore::AdClickAttribution::setCampaign): >+ (WebCore::AdClickAttribution::requestAttribution): >+ (WebCore::AdClickAttribution::attributionUrl): >+ (WebCore::AdClickAttribution::attributionReferrer): >+ * loader/AdClickAttribution.h: Added. >+ (WebCore::AdClickAttribution::Campaign::Campaign): >+ (WebCore::AdClickAttribution::Source::Source): >+ (WebCore::AdClickAttribution::Destination::Destination): >+ (WebCore::AdClickAttribution::Conversion::Conversion): >+ (WebCore::AdClickAttribution::Priority::Priority): >+ (WebCore::AdClickAttribution::AdClickAttribution): >+ (WebCore::AdClickAttribution::earliestTimeToSendAttribution): >+ > 2019-01-24 John Wilander <wilander@apple.com> > > Add Ad Click Attribution as an internal/experimental feature >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index c3d8fdb0456340c9ccf04a02f7af143988642c64..64cd85a8fa62a61b3208b7e4c6d83d0a0b21a10a 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -1995,6 +1995,8 @@ > 69A6CBAD1C6BE42C00B836E9 /* AccessibilitySVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 697101081C6BE1550018C7F1 /* AccessibilitySVGElement.h */; }; > 6A22E8701F10418600F546C3 /* InspectorCanvas.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A22E86F1F10418600F546C3 /* InspectorCanvas.h */; }; > 6A72798B1F16C29C003F39B8 /* InspectorShaderProgram.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A7279881F16C29B003F39B8 /* InspectorShaderProgram.h */; }; >+ 6B0A07F221FA4B5C00D57391 /* AdClickAttribution.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B0A07F021FA4B5C00D57391 /* AdClickAttribution.h */; settings = {ATTRIBUTES = (Private, ); }; }; >+ 6B0A07F321FA4B5C00D57391 /* AdClickAttribution.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B0A07F121FA4B5C00D57391 /* AdClickAttribution.cpp */; }; > 6B3480940EEF50D400AC1B41 /* NativeImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B3480920EEF50D400AC1B41 /* NativeImage.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 6B693A2E1C51A82E00B03BEF /* ResourceLoadObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B693A2D1C51A82E00B03BEF /* ResourceLoadObserver.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 6C4C96DF1AD4483500363F64 /* JSReadableByteStreamController.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C4C96DB1AD4483500363F64 /* JSReadableByteStreamController.h */; }; >@@ -9107,6 +9109,8 @@ > 6A22E8721F1042C400F546C3 /* InspectorCanvas.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorCanvas.cpp; sourceTree = "<group>"; }; > 6A7279881F16C29B003F39B8 /* InspectorShaderProgram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorShaderProgram.h; sourceTree = "<group>"; }; > 6A7279891F16C29B003F39B8 /* InspectorShaderProgram.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorShaderProgram.cpp; sourceTree = "<group>"; }; >+ 6B0A07F021FA4B5C00D57391 /* AdClickAttribution.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AdClickAttribution.h; sourceTree = "<group>"; }; >+ 6B0A07F121FA4B5C00D57391 /* AdClickAttribution.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AdClickAttribution.cpp; sourceTree = "<group>"; }; > 6B3480920EEF50D400AC1B41 /* NativeImage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = NativeImage.h; sourceTree = "<group>"; }; > 6B693A2D1C51A82E00B03BEF /* ResourceLoadObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceLoadObserver.h; sourceTree = "<group>"; }; > 6B693A331C51A95D00B03BEF /* ResourceLoadObserver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResourceLoadObserver.cpp; sourceTree = "<group>"; }; >@@ -25208,6 +25212,8 @@ > 5126E6B60A2E3AEF005C29FA /* icon */, > A15E31F01E0CB075004B371C /* ios */, > 93A1EAA20A5634D8006960A0 /* mac */, >+ 6B0A07F121FA4B5C00D57391 /* AdClickAttribution.cpp */, >+ 6B0A07F021FA4B5C00D57391 /* AdClickAttribution.h */, > 63152D181F9531EE007A5E4B /* ApplicationManifestLoader.cpp */, > 63152D171F9531EE007A5E4B /* ApplicationManifestLoader.h */, > EFB7287B2124C73D005C2558 /* CanvasActivityRecord.cpp */, >@@ -28246,6 +28252,7 @@ > E1C4DE690EA75C1E0023CCD6 /* ActiveDOMObject.h in Headers */, > 724EE5501DC80D7F00A91FFB /* ActivityState.h in Headers */, > 724EE5511DC80D8400A91FFB /* ActivityStateChangeObserver.h in Headers */, >+ 6B0A07F221FA4B5C00D57391 /* AdClickAttribution.h in Headers */, > A1677E0E213E02A000A08C34 /* AddressErrors.h in Headers */, > BCF7E491137CD7C7001DDAE7 /* AdjustViewSizeOrNot.h in Headers */, > 84D0C4061115F1EA0018AA34 /* AffineTransform.h in Headers */, >@@ -32713,6 +32720,7 @@ > buildActionMask = 2147483647; > files = ( > A9787CB41F5F5C6600C551C6 /* AccessibilityMediaObject.cpp in Sources */, >+ 6B0A07F321FA4B5C00D57391 /* AdClickAttribution.cpp in Sources */, > 31A795C81888BCB500382F90 /* ANGLEInstancedArrays.cpp in Sources */, > 490707E61219C04300D90E51 /* ANGLEWebKitBridge.cpp in Sources */, > CD0EEE0E14743F39003EAFA2 /* AudioDestinationIOS.cpp in Sources */, >diff --git a/Source/WebCore/loader/AdClickAttribution.cpp b/Source/WebCore/loader/AdClickAttribution.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..476f266ed13f50bb653302649f037a0d369327e0 >--- /dev/null >+++ b/Source/WebCore/loader/AdClickAttribution.cpp >@@ -0,0 +1,106 @@ >+/* >+ * Copyright (C) 2019 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "AdClickAttribution.h" >+ >+#include <wtf/RandomNumber.h> >+#include <wtf/URL.h> >+#include <wtf/text/StringBuilder.h> >+ >+namespace WebCore { >+ >+using namespace WTF; >+ >+static inline bool isMaxSixBits(unsigned short data) >+{ >+ return data < 64; >+} >+ >+bool AdClickAttribution::isValid() >+{ >+ return m_conversion >+ && isMaxSixBits(m_conversion.value().data) >+ && isMaxSixBits(m_campaign.id) >+ && !m_source.topPrivatelyControlledDomain.isEmpty() >+ && !m_destination.topPrivatelyControlledDomain.isEmpty() >+ && m_earliestTimeToSend; >+} >+ >+void AdClickAttribution::setCampaign(Campaign campaign) >+{ >+ m_campaign = campaign; >+} >+ >+void AdClickAttribution::requestAttribution(Conversion conversion, Optional<Priority> priority) >+{ >+ if ((priority && !isMaxSixBits(priority.value().value)) >+ || (m_priority && priority && m_priority.value().value > priority.value().value)) >+ return; >+ >+ m_conversion = conversion; >+ m_priority = priority; >+ // 24-48 hour delay before sending. >+ m_earliestTimeToSend = m_timeOfAdClick + 24_h + Seconds(randomNumber() * (24_h).value()); >+} >+ >+URL AdClickAttribution::attributionUrl() >+{ >+ if (!isValid()) >+ return URL(); >+ >+ StringBuilder builder; >+ builder.appendLiteral("https://"); >+ builder.append(m_source.topPrivatelyControlledDomain); >+ builder.appendLiteral("/.well-known/ad-click-attribution/"); >+ builder.appendNumber(m_conversion.value().data); >+ builder.append('/'); >+ builder.appendNumber(m_campaign.id); >+ >+ URL url { URL(), builder.toString() }; >+ if (url.isValid()) >+ return url; >+ >+ return URL(); >+} >+ >+URL AdClickAttribution::attributionReferrer() >+{ >+ if (!isValid()) >+ return URL(); >+ >+ StringBuilder builder; >+ builder.appendLiteral("https://"); >+ builder.append(m_destination.topPrivatelyControlledDomain); >+ builder.append('/'); >+ >+ URL url { URL(), builder.toString() }; >+ if (url.isValid()) >+ return url; >+ >+ return URL(); >+} >+ >+} >diff --git a/Source/WebCore/loader/AdClickAttribution.h b/Source/WebCore/loader/AdClickAttribution.h >new file mode 100644 >index 0000000000000000000000000000000000000000..eef89c66f3212039af10f94989509a12ef65e7ee >--- /dev/null >+++ b/Source/WebCore/loader/AdClickAttribution.h >@@ -0,0 +1,127 @@ >+/* >+ * Copyright (C) 2019 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#pragma once >+ >+#include "PublicSuffix.h" >+#include <wtf/Optional.h> >+#include <wtf/WallTime.h> >+#include <wtf/text/WTFString.h> >+ >+namespace WTF { >+class URL; >+} >+ >+namespace WebCore { >+ >+class AdClickAttribution { >+public: >+ typedef unsigned short CampaignId; >+ typedef unsigned short ConversionData; >+ typedef unsigned short PriorityValue; >+ >+struct Campaign { >+ explicit Campaign(CampaignId id) >+ : id(id) >+ { >+ } >+ CampaignId id; >+}; >+ >+struct Source { >+ explicit Source(const String& host) >+#if ENABLE(PUBLIC_SUFFIX_LIST) >+ : topPrivatelyControlledDomain(WebCore::topPrivatelyControlledDomain(host)) >+#else >+ : topPrivatelyControlledDomain(emptyString()) >+#endif >+ { >+ } >+ String topPrivatelyControlledDomain; >+}; >+ >+struct Destination { >+ explicit Destination(const String& host) >+#if ENABLE(PUBLIC_SUFFIX_LIST) >+ : topPrivatelyControlledDomain(WebCore::topPrivatelyControlledDomain(host)) >+#else >+ : topPrivatelyControlledDomain(emptyString()) >+#endif >+ { >+ } >+ String topPrivatelyControlledDomain; >+}; >+ >+struct Conversion { >+ explicit Conversion(ConversionData data) >+ : data(data) >+ { >+ } >+ ConversionData data; >+}; >+ >+struct Priority { >+ explicit Priority(PriorityValue value) >+ : value(value) >+ { >+ } >+ PriorityValue value; >+}; >+ >+ explicit AdClickAttribution(Campaign campaign, Source source, Destination destination) >+ : m_campaign(campaign) >+ , m_source(source) >+ , m_destination(destination) >+ , m_timeOfAdClick(WallTime::now()) >+ { >+ } >+ >+ AdClickAttribution() = delete; >+ AdClickAttribution(const AdClickAttribution&) = delete; >+ AdClickAttribution& operator=(const AdClickAttribution&) = delete; >+ AdClickAttribution(AdClickAttribution&&) = default; >+ AdClickAttribution& operator=(AdClickAttribution&&) = default; >+ >+ WEBCORE_EXPORT void setCampaign(Campaign); >+ WEBCORE_EXPORT void requestAttribution(Conversion, Optional<Priority>); >+ >+ WEBCORE_EXPORT URL attributionUrl(); >+ WEBCORE_EXPORT URL attributionReferrer(); >+ Optional<WallTime> earliestTimeToSendAttribution() { return m_earliestTimeToSend; }; >+ >+private: >+ bool isValid(); >+ >+ Campaign m_campaign; >+ Source m_source; >+ Destination m_destination; >+ WallTime m_timeOfAdClick; >+ >+ Optional<Conversion> m_conversion; >+ Optional<Priority> m_priority; >+ Optional<WallTime> m_earliestTimeToSend; >+}; >+ >+} // namespace WebCore >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 528399f2f6bc50dcc914513a9bd19031c0137bda..5c5cac00d6c679c4e8f9aa3db8194abcfe2cfbb3 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,15 @@ >+2019-01-28 John Wilander <wilander@apple.com> >+ >+ Add data abstraction and validation for Ad Click Attribution >+ https://bugs.webkit.org/show_bug.cgi?id=193916 >+ <rdar://problem/47603481> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: >+ * TestWebKitAPI/Tests/WebCore/AdClickAttribution.cpp: Added. >+ (TestWebKitAPI::TEST): >+ > 2019-01-24 John Wilander <wilander@apple.com> > > Add Ad Click Attribution as an internal/experimental feature >diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >index 63068e3a81634e0e3a73b63c011131c058a0260e..9dc1c16c59b03d16ff58659382989dc25ca45439 100644 >--- a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >+++ b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >@@ -334,6 +334,7 @@ > 637281A721AE1386009E0DE6 /* DownloadProgress.mm in Sources */ = {isa = PBXBuildFile; fileRef = 637281A621AE1386009E0DE6 /* DownloadProgress.mm */; }; > 63A61B8B1FAD251100F06885 /* display-mode.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 63A61B8A1FAD204D00F06885 /* display-mode.html */; }; > 63F668221F97F7F90032EE51 /* ApplicationManifest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 63F668201F97C3AA0032EE51 /* ApplicationManifest.mm */; }; >+ 6B0A07F721FA9C2B00D57391 /* AdClickAttribution.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B0A07F621FA9C2B00D57391 /* AdClickAttribution.cpp */; }; > 6B306106218A372900F5A802 /* ClosingWebView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6B306105218A372900F5A802 /* ClosingWebView.mm */; }; > 6B9ABE122086952F00D75DE6 /* HTTPParsers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6B9ABE112086952F00D75DE6 /* HTTPParsers.cpp */; }; > 6BFD294C1D5E6C1D008EC968 /* HashCountedSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7A38D7E51C752D5F004F157D /* HashCountedSet.cpp */; }; >@@ -1704,6 +1705,7 @@ > 637281A621AE1386009E0DE6 /* DownloadProgress.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = DownloadProgress.mm; sourceTree = "<group>"; }; > 63A61B8A1FAD204D00F06885 /* display-mode.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = "display-mode.html"; sourceTree = "<group>"; }; > 63F668201F97C3AA0032EE51 /* ApplicationManifest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ApplicationManifest.mm; sourceTree = "<group>"; }; >+ 6B0A07F621FA9C2B00D57391 /* AdClickAttribution.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AdClickAttribution.cpp; sourceTree = "<group>"; }; > 6B306105218A372900F5A802 /* ClosingWebView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ClosingWebView.mm; sourceTree = "<group>"; }; > 6B9ABE112086952F00D75DE6 /* HTTPParsers.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPParsers.cpp; sourceTree = "<group>"; }; > 751B05D51F8EAC1A0028A09E /* DatabaseTrackerTest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = DatabaseTrackerTest.mm; sourceTree = "<group>"; }; >@@ -2658,6 +2660,7 @@ > A1EC11851F4253D900D0146E /* ios */, > 3162AE9A1E6F2F8F000E4DBC /* mac */, > ABF510632A19B8AC7EC40E17 /* AbortableTaskQueue.cpp */, >+ 6B0A07F621FA9C2B00D57391 /* AdClickAttribution.cpp */, > 7A909A6F1D877475007E10F8 /* AffineTransform.cpp */, > 57152B5D21CC2045000C37CA /* ApduTest.cpp */, > 6354F4D01F7C3AB500D89DF3 /* ApplicationManifestParser.cpp */, >@@ -3891,6 +3894,7 @@ > 2E205BA41F527746005952DD /* AccessibilityTestsIOS.mm in Sources */, > 9BD5111C1FE8E11600D2B630 /* AccessingPastedImage.mm in Sources */, > F45B63FE1F19D410009D38B9 /* ActionSheetTests.mm in Sources */, >+ 6B0A07F721FA9C2B00D57391 /* AdClickAttribution.cpp in Sources */, > 37E7DD641EA06FF2009B396D /* AdditionalReadAccessAllowedURLs.mm in Sources */, > 55A817FC218100E00004A39A /* AdditionalSupportedImageTypes.mm in Sources */, > 7A909A7D1D877480007E10F8 /* AffineTransform.cpp in Sources */, >diff --git a/Tools/TestWebKitAPI/Tests/WebCore/AdClickAttribution.cpp b/Tools/TestWebKitAPI/Tests/WebCore/AdClickAttribution.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..2a139009d7136e51afc559b2aeb345f3142a8f34 >--- /dev/null >+++ b/Tools/TestWebKitAPI/Tests/WebCore/AdClickAttribution.cpp >@@ -0,0 +1,161 @@ >+/* >+ * Copyright (C) 2019 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+ >+#include <WebCore/AdClickAttribution.h> >+#include <wtf/URL.h> >+#include <wtf/WallTime.h> >+ >+using namespace WebCore; >+ >+namespace TestWebKitAPI { >+ >+constexpr unsigned short min6BitValue { 0 }; >+constexpr unsigned short max6BitValue { 63 }; >+ >+// Positive test cases. >+ >+TEST(AdClickAttribution, ValidMinValues) >+{ >+ auto attribution = AdClickAttribution(AdClickAttribution::Campaign(min6BitValue), AdClickAttribution::Source("webkit.org"), AdClickAttribution::Destination("example.com")); >+ attribution.requestAttribution(AdClickAttribution::Conversion(min6BitValue), AdClickAttribution::Priority(min6BitValue)); >+ >+ auto attributionUrl = attribution.attributionUrl(); >+ auto referrerUrl = attribution.attributionReferrer(); >+ >+ ASSERT_EQ(attributionUrl.string(), "https://webkit.org/.well-known/ad-click-attribution/0/0"); >+ ASSERT_EQ(referrerUrl.string(), "https://example.com/"); >+} >+ >+TEST(AdClickAttribution, ValidMidValues) >+{ >+ auto attribution = AdClickAttribution(AdClickAttribution::Campaign((unsigned short)12), AdClickAttribution::Source("webkit.org"), AdClickAttribution::Destination("example.com")); >+ attribution.requestAttribution(AdClickAttribution::Conversion((unsigned short)44), AdClickAttribution::Priority((unsigned short)22)); >+ >+ auto attributionUrl = attribution.attributionUrl(); >+ auto referrerUrl = attribution.attributionReferrer(); >+ >+ ASSERT_EQ(attributionUrl.string(), "https://webkit.org/.well-known/ad-click-attribution/44/12"); >+ ASSERT_EQ(referrerUrl.string(), "https://example.com/"); >+} >+ >+TEST(AdClickAttribution, ValidMaxValues) >+{ >+ auto attribution = AdClickAttribution(AdClickAttribution::Campaign(max6BitValue), AdClickAttribution::Source("webkit.org"), AdClickAttribution::Destination("example.com")); >+ attribution.requestAttribution(AdClickAttribution::Conversion(max6BitValue), AdClickAttribution::Priority(max6BitValue)); >+ >+ auto attributionUrl = attribution.attributionUrl(); >+ auto referrerUrl = attribution.attributionReferrer(); >+ >+ ASSERT_EQ(attributionUrl.string(), "https://webkit.org/.well-known/ad-click-attribution/63/63"); >+ ASSERT_EQ(referrerUrl.string(), "https://example.com/"); >+} >+ >+TEST(AdClickAttribution, EarliestTimeToSendAttributionMinimumDelay) >+{ >+ auto attribution = AdClickAttribution(AdClickAttribution::Campaign(max6BitValue), AdClickAttribution::Source("webkit.org"), AdClickAttribution::Destination("example.com")); >+ auto now = WallTime::now(); >+ attribution.requestAttribution(AdClickAttribution::Conversion(max6BitValue), AdClickAttribution::Priority(max6BitValue)); >+ auto earliestTimeToSend = attribution.earliestTimeToSendAttribution(); >+ ASSERT_TRUE(earliestTimeToSend); >+ ASSERT_TRUE(earliestTimeToSend.value().secondsSinceEpoch() - 24_h >= now.secondsSinceEpoch()); >+} >+ >+// Negative test cases. >+ >+TEST(AdClickAttribution, InvalidCampaignId) >+{ >+ auto attribution = AdClickAttribution(AdClickAttribution::Campaign(max6BitValue + 1), AdClickAttribution::Source("webkit.org"), AdClickAttribution::Destination("example.com")); >+ attribution.requestAttribution(AdClickAttribution::Conversion(max6BitValue), AdClickAttribution::Priority(max6BitValue)); >+ >+ auto attributionUrl = attribution.attributionUrl(); >+ auto referrerUrl = attribution.attributionReferrer(); >+ >+ ASSERT_TRUE(attributionUrl.string().isEmpty()); >+ ASSERT_TRUE(referrerUrl.string().isEmpty()); >+} >+ >+TEST(AdClickAttribution, InvalidSourceHost) >+{ >+ auto attribution = AdClickAttribution(AdClickAttribution::Campaign(max6BitValue), AdClickAttribution::Source("webkitorg"), AdClickAttribution::Destination("example.com")); >+ attribution.requestAttribution(AdClickAttribution::Conversion(max6BitValue), AdClickAttribution::Priority(max6BitValue)); >+ >+ auto attributionUrl = attribution.attributionUrl(); >+ auto referrerUrl = attribution.attributionReferrer(); >+ >+ ASSERT_TRUE(attributionUrl.string().isEmpty()); >+ ASSERT_TRUE(referrerUrl.string().isEmpty()); >+} >+ >+TEST(AdClickAttribution, InvalidDestinationHost) >+{ >+ auto attribution = AdClickAttribution(AdClickAttribution::Campaign(max6BitValue + 1), AdClickAttribution::Source("webkit.org"), AdClickAttribution::Destination("examplecom")); >+ attribution.requestAttribution(AdClickAttribution::Conversion(max6BitValue), AdClickAttribution::Priority(max6BitValue)); >+ >+ auto attributionUrl = attribution.attributionUrl(); >+ auto referrerUrl = attribution.attributionReferrer(); >+ >+ ASSERT_TRUE(attributionUrl.string().isEmpty()); >+ ASSERT_TRUE(referrerUrl.string().isEmpty()); >+} >+ >+TEST(AdClickAttribution, InvalidConversionData) >+{ >+ auto attribution = AdClickAttribution(AdClickAttribution::Campaign(max6BitValue), AdClickAttribution::Source("webkit.org"), AdClickAttribution::Destination("example.com")); >+ attribution.requestAttribution(AdClickAttribution::Conversion(max6BitValue + 1), AdClickAttribution::Priority(max6BitValue)); >+ >+ auto attributionUrl = attribution.attributionUrl(); >+ auto referrerUrl = attribution.attributionReferrer(); >+ >+ ASSERT_TRUE(attributionUrl.string().isEmpty()); >+ ASSERT_TRUE(referrerUrl.string().isEmpty()); >+} >+ >+TEST(AdClickAttribution, InvalidPriority) >+{ >+ auto attribution = AdClickAttribution(AdClickAttribution::Campaign(max6BitValue), AdClickAttribution::Source("webkit.org"), AdClickAttribution::Destination("example.com")); >+ attribution.requestAttribution(AdClickAttribution::Conversion(max6BitValue), AdClickAttribution::Priority(max6BitValue + 1)); >+ >+ auto attributionUrl = attribution.attributionUrl(); >+ auto referrerUrl = attribution.attributionReferrer(); >+ >+ ASSERT_TRUE(attributionUrl.string().isEmpty()); >+ ASSERT_TRUE(referrerUrl.string().isEmpty()); >+} >+ >+TEST(AdClickAttribution, InvalidMissingConversion) >+{ >+ auto attribution = AdClickAttribution(AdClickAttribution::Campaign(max6BitValue), AdClickAttribution::Source("webkit.org"), AdClickAttribution::Destination("example.com")); >+ >+ auto attributionUrl = attribution.attributionUrl(); >+ auto referrerUrl = attribution.attributionReferrer(); >+ >+ ASSERT_TRUE(attributionUrl.string().isEmpty()); >+ ASSERT_TRUE(referrerUrl.string().isEmpty()); >+ ASSERT_FALSE(attribution.earliestTimeToSendAttribution()); >+} >+ >+} // namespace TestWebKitAPI
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 193916
:
360361
|
360391
|
360432
|
360480