Changeset 269489 in webkit
- Timestamp:
- Nov 5, 2020 4:16:56 PM (21 months ago)
- Location:
- trunk
- Files:
-
- 16 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/tests/adClickAttribution/resources/conversionReport.php (modified) (3 diffs)
-
LayoutTests/http/tests/adClickAttribution/send-attribution-conversion-request-expected.txt (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Headers.cmake (modified) (1 diff)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (1 diff)
-
Source/WebCore/html/HTMLAnchorElement.cpp (modified) (1 diff)
-
Source/WebCore/loader/AdClickAttribution.cpp (modified) (3 diffs)
-
Source/WebCore/loader/AdClickAttribution.h (modified) (2 diffs)
-
Source/WebCore/platform/network/FormData.h (modified) (1 diff)
-
Source/WebCore/platform/network/HTTPHeaderValues.cpp (modified) (1 diff)
-
Source/WebCore/platform/network/HTTPHeaderValues.h (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/NetworkProcess/AdClickAttributionManager.cpp (modified) (4 diffs)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebCore/AdClickAttribution.cpp (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r269477 r269489 1 2020-11-05 John Wilander <wilander@apple.com> 2 3 PCM: Switch to JSON report format 4 https://bugs.webkit.org/show_bug.cgi?id=218634 5 <rdar://problem/70469923> 6 7 Reviewed by Brent Fulgham. 8 9 The standards conversation has landed in attribution reports in a JSON 10 format as opposed to the currently implemented URL format. Discussion 11 here: https://github.com/privacycg/private-click-measurement/issues/30 12 13 * http/tests/adClickAttribution/resources/conversionReport.php: 14 * http/tests/adClickAttribution/send-attribution-conversion-request-expected.txt: 15 1 16 2020-11-05 Chris Dumez <cdumez@apple.com> 2 17 -
trunk/LayoutTests/http/tests/adClickAttribution/resources/conversionReport.php
r244475 r269489 9 9 fwrite($conversionFile, "$name: $value\n"); 10 10 } else if ($name === "REQUEST_URI") { 11 $positionOfNonce = strpos($value, " &nonce=");11 $positionOfNonce = strpos($value, "?nonce="); 12 12 if ($positionOfNonce === false) 13 13 $outputURL = $value; … … 18 18 fwrite($conversionFile, "Cookies in conversion request: $value\n"); 19 19 $cookiesFound = true; 20 } else if ($name === "CONTENT_TYPE") { 21 fwrite($conversionFile, "Content type: $value\n"); 20 22 } 21 23 } … … 23 25 fwrite($conversionFile, "No cookies in conversion request.\n"); 24 26 } 27 28 $requestBody = file_get_contents('php://input'); 29 fwrite($conversionFile, "Request body:\n$requestBody\n"); 30 25 31 fclose($conversionFile); 26 32 rename($conversionFilePath . ".tmp", $conversionFilePath); -
trunk/LayoutTests/http/tests/adClickAttribution/send-attribution-conversion-request-expected.txt
r244475 r269489 13 13 Conversion received. 14 14 HTTP_HOST: 127.0.0.1:8000 15 REQUEST_URI: /adClickAttribution/resources/conversionReport.php?conversion=12&campaign=3 15 Content type: application/json 16 REQUEST_URI: /adClickAttribution/resources/conversionReport.php 16 17 No cookies in conversion request. 18 Request body: 19 {"content-type":"click","content-site":"127.0.0.1","content-id":3,"conversion-site":"localhost","conversion-data":12,"report-version":1} 17 20 18 21 -
trunk/Source/WebCore/ChangeLog
r269486 r269489 1 2020-11-05 John Wilander <wilander@apple.com> 2 3 PCM: Switch to JSON report format 4 https://bugs.webkit.org/show_bug.cgi?id=218634 5 <rdar://problem/70469923> 6 7 Reviewed by Brent Fulgham. 8 9 The standards conversation has landed in attribution reports in a JSON 10 format as opposed to the currently implemented URL format. Discussion 11 here: https://github.com/privacycg/private-click-measurement/issues/30 12 13 No new tests. Existing layout and API tests were updated. 14 15 * Headers.cmake: 16 Added platform/network/HTTPHeaderValues.h to be able to expose it 17 to WebKit. 18 * WebCore.xcodeproj/project.pbxproj: 19 Now exporting platform/network/HTTPHeaderValues.h. 20 * html/HTMLAnchorElement.cpp: 21 (WebCore::HTMLAnchorElement::handleClick): 22 Changed a function call from AdClickAttribution::url() to 23 AdClickAttribution::reportURL(). 24 * loader/AdClickAttribution.cpp: 25 (WebCore::AdClickAttribution::reportURL const): 26 The URL no longer carries the report values. 27 Renamed from AdClickAttribution::url(). 28 (WebCore::AdClickAttribution::json const): 29 New function to generate and return the report JSON. 30 (WebCore::AdClickAttribution::url const): Deleted. 31 Renamed to AdClickAttribution::reportURL(). 32 (WebCore::AdClickAttribution::referrer const): Deleted. 33 The referrer is now part of the report JSON. 34 (WebCore::AdClickAttribution::urlForTesting const): Deleted. 35 This class no longer needs to help generate test URLs 36 since report values are now in JSON. 37 * loader/AdClickAttribution.h: 38 * platform/network/FormData.h: 39 Added export of create(const CString&). 40 * platform/network/HTTPHeaderValues.cpp: 41 (WebCore::HTTPHeaderValues::applicationJSONContentType): 42 Used create the new JSON report request. 43 * platform/network/HTTPHeaderValues.h: 44 Added export of maxAge0(). 45 1 46 2020-11-05 Brian Burg <bburg@apple.com> 2 47 -
trunk/Source/WebCore/Headers.cmake
r269348 r269489 1344 1344 platform/network/HTTPCookieAcceptPolicy.h 1345 1345 platform/network/HTTPHeaderMap.h 1346 platform/network/HTTPHeaderValues.h 1346 1347 platform/network/HTTPParsers.h 1347 1348 platform/network/NetworkLoadInformation.h -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r269415 r269489 1068 1068 415864A023BF7CBF00A0A61E /* RealtimeVideoUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 41D1938F2152C561006F14CA /* RealtimeVideoUtilities.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1069 1069 415CDAF51E6B8F8B004F11EE /* CanvasCaptureMediaStreamTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C7E1061E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.h */; }; 1070 41614A791DA64241004AD06F /* HTTPHeaderValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 41614A771DA64236004AD06F /* HTTPHeaderValues.h */; };1070 41614A791DA64241004AD06F /* HTTPHeaderValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 41614A771DA64236004AD06F /* HTTPHeaderValues.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1071 1071 4161E2D51FE48DC500EC2E96 /* FetchLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4147E2B51C89912600A7E715 /* FetchLoader.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1072 1072 4162A451101145AE00DFF3ED /* DedicatedWorkerGlobalScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 4162A44E101145AE00DFF3ED /* DedicatedWorkerGlobalScope.h */; }; -
trunk/Source/WebCore/html/HTMLAnchorElement.cpp
r266360 r269489 522 522 // A matching conversion event needs to happen before the complete ad click attributionURL can be 523 523 // created. Thus, it should be empty for now. 524 ASSERT(!adClickAttribution || adClickAttribution-> url().isNull());524 ASSERT(!adClickAttribution || adClickAttribution->reportURL().isNull()); 525 525 526 526 frame->loader().changeLocation(completedURL, effectiveTarget, &event, LockHistory::No, LockBackForwardList::No, referrerPolicy, document().shouldOpenExternalURLsPolicyToPropagate(), newFrameOpenerPolicy, downloadAttribute, systemPreviewInfo, WTFMove(adClickAttribution)); -
trunk/Source/WebCore/loader/AdClickAttribution.cpp
r260707 r269489 148 148 } 149 149 150 URL AdClickAttribution:: url() const150 URL AdClickAttribution::reportURL() const 151 151 { 152 152 if (!isValid()) … … 157 157 builder.append(m_source.registrableDomain.string()); 158 158 builder.appendLiteral(adClickAttributionPathPrefix); 159 builder.appendNumber(m_conversion.value().data);160 builder.append('/');161 builder.appendNumber(m_campaign.id);162 159 163 160 URL url { URL(), builder.toString() }; … … 168 165 } 169 166 170 URL AdClickAttribution::referrer() const 171 { 172 if (!isValid()) 173 return URL(); 174 175 StringBuilder builder; 176 builder.appendLiteral("https://"); 177 builder.append(m_destination.registrableDomain.string()); 178 builder.append('/'); 179 180 URL url { URL(), builder.toString() }; 181 if (url.isValid()) 182 return url; 183 184 return URL(); 185 } 186 187 URL AdClickAttribution::urlForTesting(const URL& baseURL) const 188 { 189 auto host = m_source.registrableDomain.string(); 190 if (host != "localhost" && host != "127.0.0.1") 191 return URL(); 192 String relativeURL; 193 if (!baseURL.hasQuery()) 194 relativeURL = makeString("?conversion=", m_conversion.value().data, "&campaign=", m_campaign.id); 195 else 196 relativeURL = makeString("?conversion=", m_conversion.value().data, "&campaign=", m_campaign.id, '&', baseURL.query()); 197 return URL(baseURL, relativeURL); 167 Ref<JSON::Object> AdClickAttribution::json() const 168 { 169 auto reportDetails = JSON::Object::create(); 170 if (!m_conversion) 171 return reportDetails; 172 173 reportDetails->setString("content-type"_s, "click"_s); 174 reportDetails->setString("content-site"_s, m_source.registrableDomain.string()); 175 reportDetails->setInteger("content-id"_s, m_campaign.id); 176 reportDetails->setString("conversion-site"_s, m_destination.registrableDomain.string()); 177 reportDetails->setInteger("conversion-data"_s, m_conversion->data); 178 reportDetails->setInteger("report-version"_s, 1); 179 return reportDetails; 198 180 } 199 181 -
trunk/Source/WebCore/loader/AdClickAttribution.h
r264488 r269489 29 29 #include <wtf/CompletionHandler.h> 30 30 #include <wtf/Forward.h> 31 #include <wtf/JSONValues.h> 31 32 #include <wtf/Optional.h> 32 33 #include <wtf/URL.h> … … 244 245 WEBCORE_EXPORT Optional<Seconds> convertAndGetEarliestTimeToSend(Conversion&&); 245 246 WEBCORE_EXPORT bool hasHigherPriorityThan(const AdClickAttribution&) const; 246 WEBCORE_EXPORT URL url() const; 247 WEBCORE_EXPORT URL urlForTesting(const URL& baseURLForTesting) const; 248 WEBCORE_EXPORT URL referrer() const; 247 WEBCORE_EXPORT URL reportURL() const; 248 WEBCORE_EXPORT Ref<JSON::Object> json() const; 249 249 const Source& source() const { return m_source; }; 250 250 const Destination& destination() const { return m_destination; }; -
trunk/Source/WebCore/platform/network/FormData.h
r268904 r269489 193 193 WEBCORE_EXPORT static Ref<FormData> create(); 194 194 WEBCORE_EXPORT static Ref<FormData> create(const void*, size_t); 195 static Ref<FormData> create(const CString&);195 WEBCORE_EXPORT static Ref<FormData> create(const CString&); 196 196 static Ref<FormData> create(Vector<char>&&); 197 197 static Ref<FormData> create(const Vector<char>&); -
trunk/Source/WebCore/platform/network/HTTPHeaderValues.cpp
r220817 r269489 45 45 } 46 46 47 const String& applicationJSONContentType() 48 { 49 // The default encoding is UTF-8: https://www.ietf.org/rfc/rfc4627.txt. 50 static NeverDestroyed<const String> contentType(MAKE_STATIC_STRING_IMPL("application/json")); 51 return contentType; 52 } 53 47 54 const String& noCache() 48 55 { -
trunk/Source/WebCore/platform/network/HTTPHeaderValues.h
r220817 r269489 33 33 const String& textPlainContentType(); 34 34 const String& formURLEncodedContentType(); 35 WEBCORE_EXPORT const String& applicationJSONContentType(); 35 36 const String& noCache(); 36 const String& maxAge0();37 WEBCORE_EXPORT const String& maxAge0(); 37 38 } 38 39 -
trunk/Source/WebKit/ChangeLog
r269486 r269489 1 2020-11-05 John Wilander <wilander@apple.com> 2 3 PCM: Switch to JSON report format 4 https://bugs.webkit.org/show_bug.cgi?id=218634 5 <rdar://problem/70469923> 6 7 Reviewed by Brent Fulgham. 8 9 The standards conversation has landed in attribution reports in a JSON 10 format as opposed to the currently implemented URL format. Discussion 11 here: https://github.com/privacycg/private-click-measurement/issues/30 12 13 * NetworkProcess/AdClickAttributionManager.cpp: 14 (WebKit::AdClickAttributionManager::fireConversionRequest): 15 1 16 2020-11-05 Brian Burg <bburg@apple.com> 2 17 -
trunk/Source/WebKit/NetworkProcess/AdClickAttributionManager.cpp
r259236 r269489 31 31 #include <WebCore/FetchOptions.h> 32 32 #include <WebCore/FormData.h> 33 #include <WebCore/HTTPHeaderValues.h> 33 34 #include <WebCore/ResourceError.h> 34 35 #include <WebCore/ResourceRequest.h> … … 172 173 void AdClickAttributionManager::fireConversionRequest(const AdClickAttribution& attribution) 173 174 { 174 auto conversionURL = m_conversionBaseURLForTesting ? attribution.urlForTesting(*m_conversionBaseURLForTesting) : attribution.url();175 auto conversionURL = m_conversionBaseURLForTesting ? *m_conversionBaseURLForTesting : attribution.reportURL(); 175 176 if (conversionURL.isEmpty() || !conversionURL.isValid()) 176 177 return; 177 178 178 auto conversionReferrerURL = attribution.referrer(); 179 if (conversionReferrerURL.isEmpty() || !conversionReferrerURL.isValid()) 180 return; 181 182 ResourceRequest request { conversionURL }; 179 ResourceRequest request { WTFMove(conversionURL) }; 183 180 184 181 request.setHTTPMethod("POST"_s); 185 request.setHTTPHeaderField(HTTPHeaderName::CacheControl, "max-age=0"_s); 186 request.setHTTPReferrer(conversionReferrerURL.string()); 182 request.setHTTPHeaderField(HTTPHeaderName::CacheControl, WebCore::HTTPHeaderValues::maxAge0()); 183 184 request.setHTTPContentType(WebCore::HTTPHeaderValues::applicationJSONContentType()); 185 request.setHTTPBody(WebCore::FormData::create(attribution.json()->toJSONString().utf8().data())); 187 186 188 187 FetchOptions options; … … 195 194 loadParameters.identifier = ++identifier; 196 195 loadParameters.request = request; 197 loadParameters.sourceOrigin = SecurityOrigin::create(conversionReferrerURL);198 196 loadParameters.parentPID = presentingApplicationPID(); 199 197 loadParameters.storedCredentialsPolicy = StoredCredentialsPolicy::EphemeralStateless; … … 201 199 loadParameters.shouldClearReferrerOnHTTPSToHTTPRedirect = true; 202 200 loadParameters.shouldRestrictHTTPResponseAccess = false; 203 204 #if ENABLE(CONTENT_EXTENSIONS)205 loadParameters.mainDocumentURL = WTFMove(conversionReferrerURL);206 #endif207 201 208 202 if (UNLIKELY(debugModeEnabled())) { -
trunk/Tools/ChangeLog
r269486 r269489 1 2020-11-05 John Wilander <wilander@apple.com> 2 3 PCM: Switch to JSON report format 4 https://bugs.webkit.org/show_bug.cgi?id=218634 5 <rdar://problem/70469923> 6 7 Reviewed by Brent Fulgham. 8 9 The standards conversation has landed in attribution reports in a JSON 10 format as opposed to the currently implemented URL format. Discussion 11 here: https://github.com/privacycg/private-click-measurement/issues/30 12 13 * TestWebKitAPI/Tests/WebCore/AdClickAttribution.cpp: 14 (TestWebKitAPI::TEST): 15 1 16 2020-11-05 Brian Burg <bburg@apple.com> 2 17 -
trunk/Tools/TestWebKitAPI/Tests/WebCore/AdClickAttribution.cpp
r244288 r269489 47 47 attribution.convertAndGetEarliestTimeToSend(AdClickAttribution::Conversion(min6BitValue, AdClickAttribution::Priority(min6BitValue))); 48 48 49 auto attributionURL = attribution. url();50 auto referrerURL = attribution.referrer();51 52 ASSERT_EQ(attributionURL.string(), "https://webkit.org/.well-known/ad-click-attribution/0/0"); 53 ASSERT_EQ( referrerURL.string(), "https://example.com/");49 auto attributionURL = attribution.reportURL(); 50 51 ASSERT_EQ(attributionURL.string(), "https://webkit.org/.well-known/ad-click-attribution/"); 52 53 ASSERT_EQ(attribution.json()->toJSONString(), "{\"content-type\":\"click\",\"content-site\":\"webkit.org\",\"content-id\":0,\"conversion-site\":\"example.com\",\"conversion-data\":0,\"report-version\":1}"); 54 54 } 55 55 … … 59 59 attribution.convertAndGetEarliestTimeToSend(AdClickAttribution::Conversion((uint32_t)44, AdClickAttribution::Priority((uint32_t)22))); 60 60 61 auto attributionURL = attribution. url();62 auto referrerURL = attribution.referrer();63 64 ASSERT_EQ(attributionURL.string(), "https://webkit.org/.well-known/ad-click-attribution/44/12"); 65 ASSERT_EQ( referrerURL.string(), "https://example.com/");61 auto attributionURL = attribution.reportURL(); 62 63 ASSERT_EQ(attributionURL.string(), "https://webkit.org/.well-known/ad-click-attribution/"); 64 65 ASSERT_EQ(attribution.json()->toJSONString(), "{\"content-type\":\"click\",\"content-site\":\"webkit.org\",\"content-id\":12,\"conversion-site\":\"example.com\",\"conversion-data\":44,\"report-version\":1}"); 66 66 } 67 67 … … 71 71 attribution.convertAndGetEarliestTimeToSend(AdClickAttribution::Conversion(AdClickAttribution::MaxEntropy, AdClickAttribution::Priority(AdClickAttribution::MaxEntropy))); 72 72 73 auto attributionURL = attribution. url();74 auto referrerURL = attribution.referrer();75 76 ASSERT_EQ(attributionURL.string(), "https://webkit.org/.well-known/ad-click-attribution/63/63"); 77 ASSERT_EQ( referrerURL.string(), "https://example.com/");73 auto attributionURL = attribution.reportURL(); 74 75 ASSERT_EQ(attributionURL.string(), "https://webkit.org/.well-known/ad-click-attribution/"); 76 77 ASSERT_EQ(attribution.json()->toJSONString(), "{\"content-type\":\"click\",\"content-site\":\"webkit.org\",\"content-id\":63,\"conversion-site\":\"example.com\",\"conversion-data\":63,\"report-version\":1}"); 78 78 } 79 79 … … 131 131 attribution.convertAndGetEarliestTimeToSend(AdClickAttribution::Conversion(AdClickAttribution::MaxEntropy, AdClickAttribution::Priority(AdClickAttribution::MaxEntropy))); 132 132 133 auto attributionURL = attribution.url(); 134 auto referrerURL = attribution.referrer(); 135 136 ASSERT_TRUE(attributionURL.string().isEmpty()); 137 ASSERT_TRUE(referrerURL.string().isEmpty()); 133 ASSERT_TRUE(attribution.reportURL().isEmpty()); 138 134 } 139 135 … … 143 139 attribution.convertAndGetEarliestTimeToSend(AdClickAttribution::Conversion(AdClickAttribution::MaxEntropy, AdClickAttribution::Priority(AdClickAttribution::MaxEntropy))); 144 140 145 auto attributionURL = attribution.url(); 146 auto referrerURL = attribution.referrer(); 147 148 ASSERT_TRUE(attributionURL.string().isEmpty()); 149 ASSERT_TRUE(referrerURL.string().isEmpty()); 141 ASSERT_TRUE(attribution.reportURL().isEmpty()); 150 142 } 151 143 … … 155 147 attribution.convertAndGetEarliestTimeToSend(AdClickAttribution::Conversion(AdClickAttribution::MaxEntropy, AdClickAttribution::Priority(AdClickAttribution::MaxEntropy))); 156 148 157 auto attributionURL = attribution.url(); 158 auto referrerURL = attribution.referrer(); 159 160 ASSERT_TRUE(attributionURL.string().isEmpty()); 161 ASSERT_TRUE(referrerURL.string().isEmpty()); 149 ASSERT_TRUE(attribution.reportURL().isEmpty()); 162 150 } 163 151 … … 167 155 attribution.convertAndGetEarliestTimeToSend(AdClickAttribution::Conversion((AdClickAttribution::MaxEntropy + 1), AdClickAttribution::Priority(AdClickAttribution::MaxEntropy))); 168 156 169 auto attributionURL = attribution.url(); 170 auto referrerURL = attribution.referrer(); 171 172 ASSERT_TRUE(attributionURL.string().isEmpty()); 173 ASSERT_TRUE(referrerURL.string().isEmpty()); 157 ASSERT_TRUE(attribution.reportURL().isEmpty()); 174 158 } 175 159 … … 179 163 attribution.convertAndGetEarliestTimeToSend(AdClickAttribution::Conversion(AdClickAttribution::MaxEntropy, AdClickAttribution::Priority(AdClickAttribution::MaxEntropy + 1))); 180 164 181 auto attributionURL = attribution.url(); 182 auto referrerURL = attribution.referrer(); 183 184 ASSERT_TRUE(attributionURL.string().isEmpty()); 185 ASSERT_TRUE(referrerURL.string().isEmpty()); 165 ASSERT_TRUE(attribution.reportURL().isEmpty()); 186 166 } 187 167 … … 190 170 AdClickAttribution attribution { AdClickAttribution::Campaign(AdClickAttribution::MaxEntropy), AdClickAttribution::Source { webKitURL }, AdClickAttribution::Destination { exampleURL } }; 191 171 192 auto attributionURL = attribution.url(); 193 auto referrerURL = attribution.referrer(); 194 195 ASSERT_TRUE(attributionURL.string().isEmpty()); 196 ASSERT_TRUE(referrerURL.string().isEmpty()); 172 ASSERT_TRUE(attribution.reportURL().isEmpty()); 197 173 ASSERT_FALSE(attribution.earliestTimeToSend()); 198 174 }
Note: See TracChangeset
for help on using the changeset viewer.