Changeset 282110 in webkit
- Timestamp:
- Sep 7, 2021, 3:14:26 PM (4 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 2 added
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r282109 r282110 1 2021-09-07 Alex Christensen <achristensen@webkit.org> 2 3 Replace PrivateClickMeasurementNetworkLoader::start with an implementation that doesn't need NetworkSession 4 https://bugs.webkit.org/show_bug.cgi?id=230015 5 6 Reviewed by John Wilander. 7 8 This is needed to run this code in a process that doesn't have NetworkSession, which is a class tied closely to WKWebsiteDataStore. 9 This replaces it with a simple implementation that does the same things: 10 1. Uses an ephemeral stateless session that doesn't accept cookies or use credentials. 11 2. Does not allow redirects. 12 3. Only accepts JSON mime types. 13 4. Calls processPCMRequest 14 15 We still need to call NetworkSessionCocoa::allowsSpecificHTTPSCertificateForHost to get tests to pass. 16 Covered by existing tests. 17 18 * NetworkProcess/NetworkLoadParameters.h: 19 * NetworkProcess/NetworkResourceLoadParameters.cpp: 20 (WebKit::NetworkResourceLoadParameters::encode const): 21 (WebKit::NetworkResourceLoadParameters::decode): 22 * NetworkProcess/NetworkSession.h: 23 (WebKit::NetworkSession::addPrivateClickMeasurementNetworkLoader): Deleted. 24 (WebKit::NetworkSession::removePrivateClickMeasurementNetworkLoader): Deleted. 25 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementClient.h: 26 (WebKit::PCM::Client::~Client): 27 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementClientImpl.cpp: 28 (WebKit::PCM::ClientImpl::loadFromNetwork): Deleted. 29 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementClientImpl.h: 30 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.cpp: 31 (WebKit::PrivateClickMeasurementManager::getTokenPublicKey): 32 (WebKit::PrivateClickMeasurementManager::getSignedUnlinkableToken): 33 (WebKit::PrivateClickMeasurementManager::fireConversionRequestImpl): 34 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementNetworkLoader.cpp: 35 (WebKit::PCM::NetworkLoader::start): 36 (WebKit::generateNetworkLoadParameters): Deleted. 37 (WebKit::PrivateClickMeasurementNetworkLoader::start): Deleted. 38 (WebKit::PrivateClickMeasurementNetworkLoader::PrivateClickMeasurementNetworkLoader): Deleted. 39 (WebKit::PrivateClickMeasurementNetworkLoader::~PrivateClickMeasurementNetworkLoader): Deleted. 40 (WebKit::PrivateClickMeasurementNetworkLoader::fail): Deleted. 41 (WebKit::PrivateClickMeasurementNetworkLoader::cancel): Deleted. 42 (WebKit::PrivateClickMeasurementNetworkLoader::willSendRedirectedRequest): Deleted. 43 (WebKit::PrivateClickMeasurementNetworkLoader::didReceiveResponse): Deleted. 44 (WebKit::PrivateClickMeasurementNetworkLoader::didReceiveBuffer): Deleted. 45 (WebKit::PrivateClickMeasurementNetworkLoader::didFinishLoading): Deleted. 46 (WebKit::PrivateClickMeasurementNetworkLoader::didFailLoading): Deleted. 47 (WebKit::PrivateClickMeasurementNetworkLoader::didComplete): Deleted. 48 * NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementNetworkLoader.h: 49 (): Deleted. 50 * NetworkProcess/PrivateClickMeasurement/cocoa/PrivateClickMeasurementNetworkLoaderCocoa.mm: Added. 51 (processPCMRequest): 52 (-[WKNetworkSessionDelegateAllowingOnlyNonRedirectedJSON URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:]): 53 (-[WKNetworkSessionDelegateAllowingOnlyNonRedirectedJSON URLSession:dataTask:didReceiveResponse:completionHandler:]): 54 (-[WKNetworkSessionDelegateAllowingOnlyNonRedirectedJSON URLSession:task:didReceiveChallenge:completionHandler:]): 55 (WebKit::PCM::taskMap): 56 (WebKit::PCM::statelessSessionWithoutRedirects): 57 (WebKit::PCM::NetworkLoader::start): 58 * NetworkProcess/cocoa/NetworkDataTaskCocoa.h: 59 * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm: 60 (WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa): 61 (processPCMRequest): Deleted. 62 * SourcesCocoa.txt: 63 * WebKit.xcodeproj/project.pbxproj: 64 1 65 2021-09-07 Alex Christensen <achristensen@webkit.org> 2 66 -
trunk/Source/WebKit/NetworkProcess/NetworkLoadParameters.h
r278738 r282110 68 68 std::optional<NetworkActivityTracker> networkActivityTracker; 69 69 std::optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain { NavigatingToAppBoundDomain::No }; 70 std::optional<WebCore::PrivateClickMeasurement::PcmDataCarried> pcmDataCarried;71 70 }; 72 71 -
trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp
r281277 r282110 128 128 129 129 encoder << isNavigatingToAppBoundDomain; 130 encoder << pcmDataCarried;131 130 } 132 131 … … 330 329 return std::nullopt; 331 330 result.isNavigatingToAppBoundDomain = *isNavigatingToAppBoundDomain; 332 333 std::optional<std::optional<WebCore::PrivateClickMeasurement::PcmDataCarried>> pcmDataCarried;334 decoder >> pcmDataCarried;335 if (!pcmDataCarried)336 return std::nullopt;337 result.pcmDataCarried = *pcmDataCarried;338 331 339 332 return result; -
trunk/Source/WebKit/NetworkProcess/NetworkSession.h
r282006 r282110 30 30 #include "NetworkResourceLoadIdentifier.h" 31 31 #include "PrefetchCache.h" 32 #include "PrivateClickMeasurementNetworkLoader.h"33 32 #include "SandboxExtension.h" 34 33 #include "ServiceWorkerSoftUpdateLoader.h" … … 175 174 #endif 176 175 177 void addPrivateClickMeasurementNetworkLoader(std::unique_ptr<PrivateClickMeasurementNetworkLoader>&& loader) { m_privateClickMeasurementNetworkLoaders.add(WTFMove(loader)); }178 void removePrivateClickMeasurementNetworkLoader(PrivateClickMeasurementNetworkLoader* loader) { m_privateClickMeasurementNetworkLoaders.remove(loader); }179 180 176 virtual void removeNetworkWebsiteData(std::optional<WallTime>, std::optional<HashSet<WebCore::RegistrableDomain>>&&, CompletionHandler<void()>&& completionHandler) { completionHandler(); } 181 177 … … 249 245 #endif 250 246 251 HashSet<std::unique_ptr<PrivateClickMeasurementNetworkLoader>> m_privateClickMeasurementNetworkLoaders;252 247 HashMap<WebPageProxyIdentifier, String> m_attributedBundleIdentifierFromPageIdentifiers; 253 248 }; -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementClient.h
r282080 r282110 47 47 public: 48 48 virtual ~Client() { } 49 using NetworkLoadCallback = CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&, const RefPtr<JSON::Object>&)>;50 virtual void loadFromNetwork(URL&&, RefPtr<JSON::Object>&&, WebCore::PrivateClickMeasurement::PcmDataCarried, NetworkLoadCallback&&) = 0;51 49 virtual void broadcastConsoleMessage(JSC::MessageLevel, const String&) = 0; 52 50 virtual bool featureEnabled() const = 0; -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementClientImpl.cpp
r282080 r282110 38 38 , m_networkProcess(networkProcess) { } 39 39 40 void ClientImpl::loadFromNetwork(URL&& url, RefPtr<JSON::Object>&& jsonPayload, WebCore::PrivateClickMeasurement::PcmDataCarried pcmDataCarried, NetworkLoadCallback&& completionHandler)41 {42 if (!featureEnabled())43 return completionHandler(WebCore::ResourceError(WebCore::ResourceError::Type::Cancellation), { }, { });44 45 PrivateClickMeasurementNetworkLoader::start(*m_networkSession, WTFMove(url), WTFMove(jsonPayload), pcmDataCarried, WTFMove(completionHandler));46 }47 48 40 void ClientImpl::broadcastConsoleMessage(JSC::MessageLevel messageLevel, const String& message) 49 41 { -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementClientImpl.h
r282080 r282110 44 44 45 45 private: 46 void loadFromNetwork(URL&&, RefPtr<JSON::Object>&&, WebCore::PrivateClickMeasurement::PcmDataCarried, NetworkLoadCallback&&) final;47 46 void broadcastConsoleMessage(JSC::MessageLevel, const String&) final; 48 47 bool featureEnabled() const final; -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManager.cpp
r282109 r282110 30 30 #include "NetworkSession.h" 31 31 #include "PrivateClickMeasurementDebugInfo.h" 32 #include "PrivateClickMeasurementNetworkLoader.h" 32 33 #include <JavaScriptCore/ConsoleTypes.h> 33 34 #include <WebCore/FetchOptions.h> … … 132 133 m_client->broadcastConsoleMessage(MessageLevel::Log, "[Private Click Measurement] About to fire a token public key request."_s); 133 134 134 m_client->loadFromNetwork(WTFMove(tokenPublicKeyURL), nullptr, pcmDataCarried, [weakThis = makeWeakPtr(*this), this, attribution = WTFMove(attribution), callback = WTFMove(callback)] (auto& error, auto& response, auto& jsonObject) mutable {135 PCM::NetworkLoader::start(WTFMove(tokenPublicKeyURL), nullptr, pcmDataCarried, [weakThis = makeWeakPtr(*this), this, attribution = WTFMove(attribution), callback = WTFMove(callback)] (auto& error, auto& response, auto& jsonObject) mutable { 135 136 if (!weakThis) 136 137 return; … … 150 151 callback(WTFMove(attribution), jsonObject->getString("token_public_key"_s)); 151 152 }); 152 153 153 } 154 154 … … 176 176 m_client->broadcastConsoleMessage(MessageLevel::Log, "[Private Click Measurement] About to fire a unlinkable token signing request."_s); 177 177 178 m_client->loadFromNetwork(WTFMove(tokenSignatureURL), measurement.tokenSignatureJSON(), pcmDataCarried, [weakThis = makeWeakPtr(*this), this, measurement = WTFMove(measurement)] (auto& error, auto& response, auto& jsonObject) mutable {178 PCM::NetworkLoader::start(WTFMove(tokenSignatureURL), measurement.tokenSignatureJSON(), pcmDataCarried, [weakThis = makeWeakPtr(*this), this, measurement = WTFMove(measurement)] (auto& error, auto& response, auto& jsonObject) mutable { 179 179 if (!weakThis) 180 180 return; … … 358 358 m_client->broadcastConsoleMessage(MessageLevel::Log, "[Private Click Measurement] About to fire an attribution request."_s); 359 359 360 m_client->loadFromNetwork(WTFMove(attributionURL), attribution.attributionReportJSON(), pcmDataCarried, [weakThis = makeWeakPtr(*this), this](auto& error, auto& response, auto&) {360 PCM::NetworkLoader::start(WTFMove(attributionURL), attribution.attributionReportJSON(), pcmDataCarried, [weakThis = makeWeakPtr(*this), this](auto& error, auto& response, auto&) { 361 361 if (!weakThis) 362 362 return; -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementNetworkLoader.cpp
r282080 r282110 27 27 #include "PrivateClickMeasurementNetworkLoader.h" 28 28 29 #include "NetworkLoad.h" 30 #include "NetworkSession.h" 31 #include <WebCore/HTTPHeaderValues.h> 32 #include <WebCore/MIMETypeRegistry.h> 33 #include <WebCore/RuntimeApplicationChecks.h> 34 #include <WebCore/TextResourceDecoder.h> 35 36 #include <wtf/JSONValues.h> 29 #include <WebCore/NotImplemented.h> 37 30 38 31 namespace WebKit { 39 32 40 using namespace WebCore; 33 namespace PCM { 41 34 42 static NetworkLoadParameters generateNetworkLoadParameters(URL&& url, RefPtr<JSON::Object>&& jsonPayload, PrivateClickMeasurement::PcmDataCarried pcmDataCarried) 35 #if !PLATFORM(COCOA) 36 void NetworkLoader::start(URL&&, RefPtr<JSON::Object>&&, PrivateClickMeasurement::PcmDataCarried, Callback&& completionHandler) 43 37 { 44 String httpMethod = jsonPayload ? "POST"_s : "GET"_s; 38 notImplemented(); 39 completionHandler({ }, { }, { }); 40 } 41 #endif 45 42 46 ResourceRequest request { WTFMove(url) }; 47 request.setHTTPMethod(httpMethod); 48 request.setHTTPHeaderField(HTTPHeaderName::CacheControl, WebCore::HTTPHeaderValues::maxAge0()); 49 if (jsonPayload) { 50 request.setHTTPContentType(WebCore::HTTPHeaderValues::applicationJSONContentType()); 51 request.setHTTPBody(WebCore::FormData::create(jsonPayload->toJSONString().utf8())); 52 } 53 54 NetworkLoadParameters loadParameters; 55 loadParameters.request = request; 56 loadParameters.parentPID = presentingApplicationPID(); 57 loadParameters.storedCredentialsPolicy = StoredCredentialsPolicy::EphemeralStateless; 58 loadParameters.shouldClearReferrerOnHTTPSToHTTPRedirect = true; 59 loadParameters.pcmDataCarried = pcmDataCarried; 60 61 return loadParameters; 62 } 63 64 void PrivateClickMeasurementNetworkLoader::start(NetworkSession& session, URL&& url, RefPtr<JSON::Object>&& jsonPayload, PrivateClickMeasurement::PcmDataCarried pcmDataCarried, Callback&& completionHandler) 65 { 66 auto parameters = generateNetworkLoadParameters(WTFMove(url), WTFMove(jsonPayload), pcmDataCarried); 67 auto loader = std::unique_ptr<PrivateClickMeasurementNetworkLoader>(new PrivateClickMeasurementNetworkLoader(session, WTFMove(parameters), WTFMove(completionHandler))); 68 session.addPrivateClickMeasurementNetworkLoader(WTFMove(loader)); 69 } 70 71 PrivateClickMeasurementNetworkLoader::PrivateClickMeasurementNetworkLoader(NetworkSession& session, NetworkLoadParameters&& parameters, Callback&& completionHandler) 72 : m_session(makeWeakPtr(session)) 73 , m_completionHandler(WTFMove(completionHandler)) 74 { 75 m_networkLoad = makeUnique<NetworkLoad>(*this, nullptr, WTFMove(parameters), *m_session); 76 m_networkLoad->start(); 77 } 78 79 PrivateClickMeasurementNetworkLoader::~PrivateClickMeasurementNetworkLoader() 80 { 81 cancel(); 82 } 83 84 void PrivateClickMeasurementNetworkLoader::fail(ResourceError&& error) 85 { 86 if (!m_completionHandler) 87 return; 88 89 m_completionHandler(WTFMove(error), { }, nullptr); 90 didComplete(); 91 } 92 93 void PrivateClickMeasurementNetworkLoader::cancel() 94 { 95 fail(ResourceError { ResourceError::Type::Cancellation }); 96 } 97 98 void PrivateClickMeasurementNetworkLoader::willSendRedirectedRequest(ResourceRequest&&, ResourceRequest&&, ResourceResponse&&) 99 { 100 cancel(); 101 } 102 103 void PrivateClickMeasurementNetworkLoader::didReceiveResponse(ResourceResponse&& response, ResponseCompletionHandler&& completionHandler) 104 { 105 if (!MIMETypeRegistry::isSupportedJSONMIMEType(response.mimeType())) { 106 fail({ errorDomainWebKitInternal, 0, response.url(), "MIME Type is not a JSON MIME type"_s }); 107 completionHandler(PolicyAction::Ignore); 108 return; 109 } 110 111 m_response = WTFMove(response); 112 completionHandler(PolicyAction::Use); 113 } 114 115 void PrivateClickMeasurementNetworkLoader::didReceiveBuffer(Ref<SharedBuffer>&& buffer, int reportedEncodedDataLength) 116 { 117 if (!m_decoder) 118 m_decoder = TextResourceDecoder::create("application/json"_s, m_response.textEncodingName().isEmpty() ? WebCore::TextEncoding("UTF-8") : WebCore::TextEncoding(m_response.textEncodingName())); 119 120 if (auto size = buffer->size()) 121 m_jsonString.append(m_decoder->decode(buffer->data(), size)); 122 } 123 124 void PrivateClickMeasurementNetworkLoader::didFinishLoading(const WebCore::NetworkLoadMetrics&) 125 { 126 if (m_decoder) 127 m_jsonString.append(m_decoder->flush()); 128 129 if (auto jsonValue = JSON::Value::parseJSON(m_jsonString.toString())) 130 m_completionHandler({ }, m_response, jsonValue->asObject()); 131 else 132 m_completionHandler({ }, m_response, nullptr); 133 134 didComplete(); 135 } 136 137 void PrivateClickMeasurementNetworkLoader::didFailLoading(const ResourceError& error) 138 { 139 fail(ResourceError(error)); 140 } 141 142 void PrivateClickMeasurementNetworkLoader::didComplete() 143 { 144 m_networkLoad = nullptr; 145 if (m_session) 146 m_session->removePrivateClickMeasurementNetworkLoader(this); 147 } 43 } // namespace PCM 148 44 149 45 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementNetworkLoader.h
r282031 r282110 26 26 #pragma once 27 27 28 #include "NetworkLoad.h"29 #include "NetworkLoadClient.h"30 #include "NetworkLoadParameters.h"31 #include <WebCore/TextResourceDecoder.h>32 28 #include <wtf/CompletionHandler.h> 33 #include <wtf/WeakPtr.h> 29 #include <wtf/JSONValues.h> 30 31 namespace WebCore { 32 class ResourceError; 33 class ResourceResponse; 34 } 34 35 35 36 namespace WebKit { 36 37 37 class NetworkSession; 38 namespace PCM { 38 39 39 class PrivateClickMeasurementNetworkLoader final : public NetworkLoadClient{40 class NetworkLoader { 40 41 WTF_MAKE_FAST_ALLOCATED; 41 42 public: 42 43 using Callback = CompletionHandler<void(const WebCore::ResourceError&, const WebCore::ResourceResponse&, const RefPtr<JSON::Object>&)>; 43 static void start(NetworkSession&, URL&&, RefPtr<JSON::Object>&&, WebCore::PrivateClickMeasurement::PcmDataCarried, Callback&&); 44 45 ~PrivateClickMeasurementNetworkLoader(); 46 47 private: 48 PrivateClickMeasurementNetworkLoader(NetworkSession&, NetworkLoadParameters&&, Callback&&); 49 50 // NetworkLoadClient. 51 void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) final { } 52 bool isSynchronous() const final { return false; } 53 bool isAllowedToAskUserForCredentials() const final { return false; } 54 void willSendRedirectedRequest(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&& redirectResponse) final; 55 void didReceiveResponse(WebCore::ResourceResponse&&, ResponseCompletionHandler&&) final; 56 void didReceiveBuffer(Ref<WebCore::SharedBuffer>&&, int reportedEncodedDataLength) final; 57 void didFinishLoading(const WebCore::NetworkLoadMetrics&) final; 58 void didFailLoading(const WebCore::ResourceError&) final; 59 60 void fail(WebCore::ResourceError&&); 61 void cancel(); 62 void didComplete(); 63 64 WeakPtr<NetworkSession> m_session; 65 std::unique_ptr<NetworkLoad> m_networkLoad; 66 Callback m_completionHandler; 67 68 WebCore::ResourceResponse m_response; 69 RefPtr<WebCore::TextResourceDecoder> m_decoder; 70 StringBuilder m_jsonString; 44 static void start(URL&&, RefPtr<JSON::Object>&&, WebCore::PrivateClickMeasurement::PcmDataCarried, Callback&&); 71 45 }; 72 46 47 } // namespace PCM 48 73 49 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h
r278738 r282110 30 30 #include "NetworkLoadParameters.h" 31 31 #include <WebCore/NetworkLoadMetrics.h> 32 #include <WebCore/PrivateClickMeasurement.h> 32 33 #include <wtf/RetainPtr.h> 33 34 34 35 OBJC_CLASS NSHTTPCookieStorage; 35 36 OBJC_CLASS NSURLSessionDataTask; 37 OBJC_CLASS NSMutableURLRequest; 36 38 37 39 namespace WebCore { -
trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm
r280317 r282110 58 58 #import <WebKitAdditions/NetworkDataTaskCocoaAdditions.h> 59 59 #else 60 static void processPCMRequest(WebCore::PrivateClickMeasurement::PcmDataCarried, NSMutableURLRequest *) { }61 60 static void overrideAttributionContext(NSMutableURLRequest *) { } 62 61 #endif … … 347 346 348 347 overrideAttributionContext(mutableRequest.get()); 349 350 if (parameters.pcmDataCarried)351 processPCMRequest(*parameters.pcmDataCarried, mutableRequest.get());352 348 353 349 nsRequest = mutableRequest; -
trunk/Source/WebKit/SourcesCocoa.txt
r280451 r282110 41 41 NetworkProcess/EntryPoint/Cocoa/Daemon/DaemonEntryPoint.mm 42 42 NetworkProcess/EntryPoint/Cocoa/XPCService/NetworkServiceEntryPoint.mm 43 44 NetworkProcess/PrivateClickMeasurement/cocoa/PrivateClickMeasurementNetworkLoaderCocoa.mm 43 45 44 46 NetworkProcess/WebStorage/ios/LocalStorageDatabaseTrackerIOS.mm -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r282054 r282110 4556 4556 5CB930C026E0542F0032B1C0 /* PrivateClickMeasurementClientImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PrivateClickMeasurementClientImpl.cpp; sourceTree = "<group>"; }; 4557 4557 5CB930C126E054B80032B1C0 /* PrivateClickMeasurementClientImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PrivateClickMeasurementClientImpl.h; sourceTree = "<group>"; }; 4558 5CB930F226E7EEE00032B1C0 /* PrivateClickMeasurementNetworkLoaderCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PrivateClickMeasurementNetworkLoaderCocoa.mm; sourceTree = "<group>"; }; 4558 4559 5CBC9B891C6524A500A8FDCF /* NetworkDataTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkDataTask.h; sourceTree = "<group>"; }; 4559 4560 5CBC9B8B1C65257300A8FDCF /* NetworkDataTaskCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkDataTaskCocoa.mm; sourceTree = "<group>"; }; … … 9261 9262 isa = PBXGroup; 9262 9263 children = ( 9264 5CB930F126E7EE890032B1C0 /* cocoa */, 9263 9265 5CB930BF26E0542E0032B1C0 /* PrivateClickMeasurementClient.h */, 9264 9266 5CB930C026E0542F0032B1C0 /* PrivateClickMeasurementClientImpl.cpp */, … … 9352 9354 ); 9353 9355 path = Cocoa; 9356 sourceTree = "<group>"; 9357 }; 9358 5CB930F126E7EE890032B1C0 /* cocoa */ = { 9359 isa = PBXGroup; 9360 children = ( 9361 5CB930F226E7EEE00032B1C0 /* PrivateClickMeasurementNetworkLoaderCocoa.mm */, 9362 ); 9363 path = cocoa; 9354 9364 sourceTree = "<group>"; 9355 9365 };
Note:
See TracChangeset
for help on using the changeset viewer.