https://bugs.webkit.org/show_bug.cgi?id=195117
<rdar://problem/
48448715>
Reviewed by Brent Fulgham.
Reading of user defaults on Cocoa platforms should be done in the UI process and
forwarded to Resource Load Statistics in the network process through the
WebKit::NetworkSessionCreationParameters struct.
This patch does away with some old user defaults we don't use anymore. It also
changes the developer-facing default name to ITPManualPrevalentResource.
* NetworkProcess/Classifier/ResourceLoadStatisticsDatabaseStore.cpp:
(WebKit::ResourceLoadStatisticsDatabaseStore::ResourceLoadStatisticsDatabaseStore):
Removed the call to the old registerUserDefaultsIfNeeded().
* NetworkProcess/Classifier/ResourceLoadStatisticsMemoryStore.cpp:
(WebKit::ResourceLoadStatisticsMemoryStore::ResourceLoadStatisticsMemoryStore):
Removed the call to the old registerUserDefaultsIfNeeded().
* NetworkProcess/Classifier/ResourceLoadStatisticsStore.h:
Removed the declaration of the old registerUserDefaultsIfNeeded().
* NetworkProcess/Classifier/ResourceLoadStatisticsStoreCocoa.mm: Removed.
* NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h:
Added an enum class EnableResourceLoadStatisticsDebugMode.
* NetworkProcess/NetworkSession.cpp:
(WebKit::NetworkSession::setResourceLoadStatisticsEnabled):
* NetworkProcess/NetworkSession.h:
* NetworkProcess/NetworkSessionCreationParameters.cpp:
(WebKit::NetworkSessionCreationParameters::encode const):
(WebKit::NetworkSessionCreationParameters::decode):
* NetworkProcess/NetworkSessionCreationParameters.h:
The struct now has two new fields:
- enableResourceLoadStatisticsDebugMode
- resourceLoadStatisticsManualPrevalentResource
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(WebKit::NetworkSessionCocoa::NetworkSessionCocoa):
Forwarding of the parameters.
* SourcesCocoa.txt:
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::ensureNetworkProcess):
Forwarding of the parameters.
* UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:
(WebKit::WebsiteDataStore::parameters):
This is where user defaults for Resource Load Statistics are now read.
* WebKit.xcodeproj/project.pbxproj:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242764
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2019-03-11 John Wilander <wilander@apple.com>
+
+ Move NetworkProcess/Classifier/ResourceLoadStatisticsStoreCocoa.mm functionality into UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm
+ https://bugs.webkit.org/show_bug.cgi?id=195117
+ <rdar://problem/48448715>
+
+ Reviewed by Brent Fulgham.
+
+ Reading of user defaults on Cocoa platforms should be done in the UI process and
+ forwarded to Resource Load Statistics in the network process through the
+ WebKit::NetworkSessionCreationParameters struct.
+
+ This patch does away with some old user defaults we don't use anymore. It also
+ changes the developer-facing default name to ITPManualPrevalentResource.
+
+ * NetworkProcess/Classifier/ResourceLoadStatisticsDatabaseStore.cpp:
+ (WebKit::ResourceLoadStatisticsDatabaseStore::ResourceLoadStatisticsDatabaseStore):
+ Removed the call to the old registerUserDefaultsIfNeeded().
+ * NetworkProcess/Classifier/ResourceLoadStatisticsMemoryStore.cpp:
+ (WebKit::ResourceLoadStatisticsMemoryStore::ResourceLoadStatisticsMemoryStore):
+ Removed the call to the old registerUserDefaultsIfNeeded().
+ * NetworkProcess/Classifier/ResourceLoadStatisticsStore.h:
+ Removed the declaration of the old registerUserDefaultsIfNeeded().
+ * NetworkProcess/Classifier/ResourceLoadStatisticsStoreCocoa.mm: Removed.
+ * NetworkProcess/Classifier/WebResourceLoadStatisticsStore.h:
+ Added an enum class EnableResourceLoadStatisticsDebugMode.
+ * NetworkProcess/NetworkSession.cpp:
+ (WebKit::NetworkSession::setResourceLoadStatisticsEnabled):
+ * NetworkProcess/NetworkSession.h:
+ * NetworkProcess/NetworkSessionCreationParameters.cpp:
+ (WebKit::NetworkSessionCreationParameters::encode const):
+ (WebKit::NetworkSessionCreationParameters::decode):
+ * NetworkProcess/NetworkSessionCreationParameters.h:
+ The struct now has two new fields:
+ - enableResourceLoadStatisticsDebugMode
+ - resourceLoadStatisticsManualPrevalentResource
+ * NetworkProcess/cocoa/NetworkSessionCocoa.mm:
+ (WebKit::NetworkSessionCocoa::NetworkSessionCocoa):
+ Forwarding of the parameters.
+ * SourcesCocoa.txt:
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::ensureNetworkProcess):
+ Forwarding of the parameters.
+ * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm:
+ (WebKit::WebsiteDataStore::parameters):
+ This is where user defaults for Resource Load Statistics are now read.
+ * WebKit.xcodeproj/project.pbxproj:
+
2019-03-11 Zalan Bujtas <zalan@apple.com>
[Synthetic Click] Dispatch mouseout soon after mouseup
{
ASSERT(!RunLoop::isMain());
-#if PLATFORM(COCOA)
- registerUserDefaultsIfNeeded();
-#endif
-
if (!m_database.open(m_storageDirectoryPath)) {
RELEASE_LOG_ERROR(Network, "%p - ResourceLoadStatisticsDatabaseStore::open failed, error message: %{public}s, database path: %{public}s", this, m_database.lastErrorMsg(), m_storageDirectoryPath.utf8().data());
ASSERT_NOT_REACHED();
{
ASSERT(!RunLoop::isMain());
-#if PLATFORM(COCOA)
- registerUserDefaultsIfNeeded();
-#endif
-
workQueue.dispatchAfter(5_s, [weakThis = makeWeakPtr(*this)] {
if (weakThis)
weakThis->calculateAndSubmitTelemetry();
bool hasStatisticsExpired(const ResourceLoadStatistics&) const;
bool hasStatisticsExpired(WallTime mostRecentUserInteractionTime) const;
-#if PLATFORM(COCOA)
- void registerUserDefaultsIfNeeded();
-#endif
void scheduleStatisticsProcessingRequestIfNecessary();
void mergeOperatingDates(Vector<OperatingDate>&&);
virtual Vector<RegistrableDomain> ensurePrevalentResourcesForDebugMode() = 0;
+++ /dev/null
-/*
- * Copyright (C) 2017-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.
- */
-
-#import "config.h"
-#import "ResourceLoadStatisticsStore.h"
-
-#if ENABLE(RESOURCE_LOAD_STATISTICS)
-
-#import <WebCore/RegistrableDomain.h>
-#import <wtf/text/StringBuilder.h>
-#import <wtf/text/WTFString.h>
-
-namespace WebKit {
-
-void ResourceLoadStatisticsStore::registerUserDefaultsIfNeeded()
-{
- static dispatch_once_t initOnce;
-
- dispatch_once(&initOnce, ^{
- Seconds timeToLiveUserInteraction([[NSUserDefaults standardUserDefaults] doubleForKey:@"ResourceLoadStatisticsTimeToLiveUserInteraction"]);
- if (timeToLiveUserInteraction > 0_s && timeToLiveUserInteraction <= 24_h * 30)
- setTimeToLiveUserInteraction(timeToLiveUserInteraction);
-
- Seconds minimumTimeBetweenDataRecordsRemoval([[NSUserDefaults standardUserDefaults] doubleForKey:@"ResourceLoadStatisticsMinimumTimeBetweenDataRecordsRemoval"]);
- if (minimumTimeBetweenDataRecordsRemoval > 0_s && minimumTimeBetweenDataRecordsRemoval < 1_h)
- setMinimumTimeBetweenDataRecordsRemoval(minimumTimeBetweenDataRecordsRemoval);
-
- Seconds grandfatheringTime([[NSUserDefaults standardUserDefaults] doubleForKey:@"ResourceLoadStatisticsGrandfatheringTime"]);
- if (grandfatheringTime > 0_s && grandfatheringTime <= 24_h * 7)
- setGrandfatheringTime(grandfatheringTime);
-
- setResourceLoadStatisticsDebugMode([[NSUserDefaults standardUserDefaults] boolForKey:@"ItpDebugMode"]);
- auto* debugManualPrevalentResource = [[NSUserDefaults standardUserDefaults] stringForKey:@"ItpManualPrevalentResource"];
- if (debugManualPrevalentResource) {
- URL url { URL(), debugManualPrevalentResource };
- if (!url.isValid()) {
- StringBuilder builder;
- builder.appendLiteral("http://");
- builder.append(debugManualPrevalentResource);
- url = { URL(), builder.toString() };
- }
- if (url.isValid())
- setPrevalentResourceForDebugMode(RegistrableDomain { url });
- }
-
- Seconds cacheMaxAgeCapForPrevalentResources([[NSUserDefaults standardUserDefaults] doubleForKey:@"ResourceLoadStatisticsCacheMaxAgeCap"]);
- if (cacheMaxAgeCapForPrevalentResources > 0_s && cacheMaxAgeCapForPrevalentResources <= 24_h * 365)
- setCacheMaxAgeCap(cacheMaxAgeCapForPrevalentResources);
-
- Seconds clientSideCookiesAgeCap([[NSUserDefaults standardUserDefaults] doubleForKey:@"ResourceLoadStatisticsClientSideCookiesAgeCap"]);
- if (clientSideCookiesAgeCap > 0_s && clientSideCookiesAgeCap <= 24_h * 365)
- setAgeCapForClientSideCookies(clientSideCookiesAgeCap);
- });
-}
-
-}
-
-#endif
class WebProcessProxy;
enum class ShouldGrandfatherStatistics : bool;
enum class ShouldIncludeLocalhost : bool { No, Yes };
+enum class EnableResourceLoadStatisticsDebugMode : bool { No, Yes };
class WebResourceLoadStatisticsStore final : public ThreadSafeRefCounted<WebResourceLoadStatisticsStore, WTF::DestructionThread::Main>, public IPC::MessageReceiver {
public:
return;
m_resourceLoadStatistics = WebResourceLoadStatisticsStore::create(*this, m_resourceLoadStatisticsDirectory, m_shouldIncludeLocalhostInResourceLoadStatistics);
+
+ if (m_enableResourceLoadStatisticsDebugMode == EnableResourceLoadStatisticsDebugMode::Yes)
+ m_resourceLoadStatistics->setResourceLoadStatisticsDebugMode(true, [] { });
+ // This should always be forwarded since debug mode may be enabled at runtime.
+ if (!m_resourceLoadStatisticsManualPrevalentResource.isEmpty())
+ m_resourceLoadStatistics->setPrevalentResourceForDebugMode(m_resourceLoadStatisticsManualPrevalentResource, [] { });
}
void NetworkSession::notifyResourceLoadStatisticsProcessed()
#if ENABLE(RESOURCE_LOAD_STATISTICS)
RefPtr<WebResourceLoadStatisticsStore> m_resourceLoadStatistics;
ShouldIncludeLocalhost m_shouldIncludeLocalhostInResourceLoadStatistics { ShouldIncludeLocalhost::Yes };
+ EnableResourceLoadStatisticsDebugMode m_enableResourceLoadStatisticsDebugMode { EnableResourceLoadStatisticsDebugMode::No };
+ WebCore::RegistrableDomain m_resourceLoadStatisticsManualPrevalentResource;
#endif
UniqueRef<NetworkAdClickAttribution> m_adClickAttribution;
};
encoder << resourceLoadStatisticsDirectoryExtensionHandle;
encoder << enableResourceLoadStatistics;
encoder << shouldIncludeLocalhostInResourceLoadStatistics;
+ encoder << enableResourceLoadStatisticsDebugMode;
+ encoder << resourceLoadStatisticsManualPrevalentResource;
}
Optional<NetworkSessionCreationParameters> NetworkSessionCreationParameters::decode(IPC::Decoder& decoder)
if (!shouldIncludeLocalhostInResourceLoadStatistics)
return WTF::nullopt;
+ Optional<bool> enableResourceLoadStatisticsDebugMode;
+ decoder >> enableResourceLoadStatisticsDebugMode;
+ if (!enableResourceLoadStatisticsDebugMode)
+ return WTF::nullopt;
+
+ Optional<WebCore::RegistrableDomain> resourceLoadStatisticsManualPrevalentResource;
+ decoder >> resourceLoadStatisticsManualPrevalentResource;
+ if (!resourceLoadStatisticsManualPrevalentResource)
+ return WTF::nullopt;
+
return {{
sessionID
, WTFMove(*boundInterfaceIdentifier)
, WTFMove(*resourceLoadStatisticsDirectoryExtensionHandle)
, WTFMove(*enableResourceLoadStatistics)
, WTFMove(*shouldIncludeLocalhostInResourceLoadStatistics)
+ , WTFMove(*enableResourceLoadStatisticsDebugMode)
+ , WTFMove(*resourceLoadStatisticsManualPrevalentResource)
}};
}
#pragma once
#include "SandboxExtension.h"
+#include <WebCore/RegistrableDomain.h>
#include <pal/SessionID.h>
#include <wtf/Seconds.h>
#include <wtf/URL.h>
SandboxExtension::Handle resourceLoadStatisticsDirectoryExtensionHandle;
bool enableResourceLoadStatistics { false };
bool shouldIncludeLocalhostInResourceLoadStatistics { true };
+ bool enableResourceLoadStatisticsDebugMode { false };
+ WebCore::RegistrableDomain resourceLoadStatisticsManualPrevalentResource { };
};
} // namespace WebKit
#if ENABLE(RESOURCE_LOAD_STATISTICS)
m_resourceLoadStatisticsDirectory = parameters.resourceLoadStatisticsDirectory;
m_shouldIncludeLocalhostInResourceLoadStatistics = parameters.shouldIncludeLocalhostInResourceLoadStatistics ? ShouldIncludeLocalhost::Yes : ShouldIncludeLocalhost::No;
+ m_enableResourceLoadStatisticsDebugMode = parameters.enableResourceLoadStatisticsDebugMode ? EnableResourceLoadStatisticsDebugMode::Yes : EnableResourceLoadStatisticsDebugMode::No;
+ m_resourceLoadStatisticsManualPrevalentResource = parameters.resourceLoadStatisticsManualPrevalentResource;
setResourceLoadStatisticsEnabled(parameters.enableResourceLoadStatistics);
#endif
NetworkProcess/cocoa/NetworkProcessCocoa.mm
NetworkProcess/cocoa/NetworkSessionCocoa.mm
-NetworkProcess/Classifier/ResourceLoadStatisticsStoreCocoa.mm
NetworkProcess/Classifier/WebResourceLoadStatisticsStore.cpp
NetworkProcess/Classifier/WebResourceLoadStatisticsTelemetry.cpp
bool enableResourceLoadStatistics = false;
bool shouldIncludeLocalhost = true;
+ bool enableResourceLoadStatisticsDebugMode = false;
+ WebCore::RegistrableDomain manualPrevalentResource { };
if (withWebsiteDataStore) {
enableResourceLoadStatistics = withWebsiteDataStore->resourceLoadStatisticsEnabled();
- shouldIncludeLocalhost = withWebsiteDataStore->parameters().networkSessionParameters.shouldIncludeLocalhostInResourceLoadStatistics;
+ if (enableResourceLoadStatistics) {
+ auto networkSessionParameters = withWebsiteDataStore->parameters().networkSessionParameters;
+ shouldIncludeLocalhost = networkSessionParameters.shouldIncludeLocalhostInResourceLoadStatistics;
+ enableResourceLoadStatisticsDebugMode = networkSessionParameters.enableResourceLoadStatisticsDebugMode;
+ manualPrevalentResource = networkSessionParameters.resourceLoadStatisticsManualPrevalentResource;
+ }
} else if (m_websiteDataStore) {
enableResourceLoadStatistics = m_websiteDataStore->resourceLoadStatisticsEnabled();
- shouldIncludeLocalhost = m_websiteDataStore->websiteDataStore().parameters().networkSessionParameters.shouldIncludeLocalhostInResourceLoadStatistics;
+ if (enableResourceLoadStatistics) {
+ auto networkSessionParameters = m_websiteDataStore->websiteDataStore().parameters().networkSessionParameters;
+ shouldIncludeLocalhost = networkSessionParameters.shouldIncludeLocalhostInResourceLoadStatistics;
+ enableResourceLoadStatisticsDebugMode = networkSessionParameters.enableResourceLoadStatisticsDebugMode;
+ manualPrevalentResource = networkSessionParameters.resourceLoadStatisticsManualPrevalentResource;
+ }
}
parameters.defaultDataStoreParameters.networkSessionParameters.enableResourceLoadStatistics = enableResourceLoadStatistics;
parameters.defaultDataStoreParameters.networkSessionParameters.shouldIncludeLocalhostInResourceLoadStatistics = shouldIncludeLocalhost;
+ parameters.defaultDataStoreParameters.networkSessionParameters.enableResourceLoadStatisticsDebugMode = enableResourceLoadStatisticsDebugMode;
+ parameters.defaultDataStoreParameters.networkSessionParameters.resourceLoadStatisticsManualPrevalentResource = manualPrevalentResource;
// Add any platform specific parameters
platformInitializeNetworkProcess(parameters);
#import "StorageManager.h"
#import "WebResourceLoadStatisticsStore.h"
#import "WebsiteDataStoreParameters.h"
+#import <WebCore/RegistrableDomain.h>
#import <WebCore/RuntimeApplicationChecks.h>
#import <WebCore/SearchPopupMenuCocoa.h>
#import <pal/spi/cf/CFNetworkSPI.h>
#import <wtf/FileSystem.h>
#import <wtf/NeverDestroyed.h>
#import <wtf/ProcessPrivilege.h>
+#import <wtf/URL.h>
+#import <wtf/text/StringBuilder.h>
#if PLATFORM(IOS_FAMILY)
#import <UIKit/UIApplication.h>
resolveDirectoriesIfNecessary();
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-#if ENABLE(RESOURCE_LOAD_STATISTICS) && !RELEASE_LOG_DISABLED
- static NSString * const WebKitLogCookieInformationDefaultsKey = @"WebKitLogCookieInformation";
- bool shouldLogCookieInformation = [defaults boolForKey:WebKitLogCookieInformationDefaultsKey];
-#else
bool shouldLogCookieInformation = false;
+ bool enableResourceLoadStatisticsDebugMode = false;
+ WebCore::RegistrableDomain resourceLoadStatisticsManualPrevalentResource { };
+#if ENABLE(RESOURCE_LOAD_STATISTICS)
+ enableResourceLoadStatisticsDebugMode = [defaults boolForKey:@"ITPDebugMode"];
+ auto* manualPrevalentResource = [defaults stringForKey:@"ITPManualPrevalentResource"];
+ if (manualPrevalentResource) {
+ URL url { URL(), manualPrevalentResource };
+ if (!url.isValid()) {
+ StringBuilder builder;
+ builder.appendLiteral("http://");
+ builder.append(manualPrevalentResource);
+ url = { URL(), builder.toString() };
+ }
+ if (url.isValid())
+ resourceLoadStatisticsManualPrevalentResource = WebCore::RegistrableDomain { url };
+ }
+#if !RELEASE_LOG_DISABLED
+ static NSString * const WebKitLogCookieInformationDefaultsKey = @"WebKitLogCookieInformation";
+ shouldLogCookieInformation = [defaults boolForKey:WebKitLogCookieInformationDefaultsKey];
#endif
+#endif // ENABLE(RESOURCE_LOAD_STATISTICS)
URL httpProxy = m_configuration->httpProxy();
URL httpsProxy = m_configuration->httpsProxy();
if (!resourceLoadStatisticsDirectory.isEmpty())
SandboxExtension::createHandleForReadWriteDirectory(resourceLoadStatisticsDirectory, resourceLoadStatisticsDirectoryHandle);
+ bool shouldIncludeLocalhostInResourceLoadStatistics = isSafari;
WebsiteDataStoreParameters parameters;
parameters.networkSessionParameters = {
m_sessionID,
WTFMove(resourceLoadStatisticsDirectory),
WTFMove(resourceLoadStatisticsDirectoryHandle),
false,
- isSafari
+ shouldIncludeLocalhostInResourceLoadStatistics,
+ enableResourceLoadStatisticsDebugMode,
+ WTFMove(resourceLoadStatisticsManualPrevalentResource)
};
finalizeApplicationIdentifiers();
7AB6EA461EEAB6B000037B2B /* APIGeolocationProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIGeolocationProvider.h; sourceTree = "<group>"; };
7ACE82E7221CAE06000DA94C /* ResourceLoadStatisticsStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ResourceLoadStatisticsStore.h; path = Classifier/ResourceLoadStatisticsStore.h; sourceTree = "<group>"; };
7ACE82E8221CAE07000DA94C /* ResourceLoadStatisticsStore.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ResourceLoadStatisticsStore.cpp; path = Classifier/ResourceLoadStatisticsStore.cpp; sourceTree = "<group>"; };
- 7ACE82E9221DE722000DA94C /* ResourceLoadStatisticsStoreCocoa.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = ResourceLoadStatisticsStoreCocoa.mm; path = Classifier/ResourceLoadStatisticsStoreCocoa.mm; sourceTree = "<group>"; };
7AF2361E1E79A3B400438A05 /* WebErrors.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebErrors.cpp; sourceTree = "<group>"; };
7AF2361F1E79A3D800438A05 /* WebErrors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebErrors.h; sourceTree = "<group>"; };
7AF236221E79A43100438A05 /* WebErrorsCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebErrorsCocoa.mm; sourceTree = "<group>"; };
7AFBD36821E542E8005DBACB /* ResourceLoadStatisticsPersistentStorage.h */,
7ACE82E8221CAE07000DA94C /* ResourceLoadStatisticsStore.cpp */,
7ACE82E7221CAE06000DA94C /* ResourceLoadStatisticsStore.h */,
- 7ACE82E9221DE722000DA94C /* ResourceLoadStatisticsStoreCocoa.mm */,
7A41E9FA21F81DAC00B88CDB /* ShouldGrandfatherStatistics.h */,
7A3FECA121F7C09700F267CD /* StorageAccessStatus.h */,
7A843A1A21E41FB200DEF663 /* WebResourceLoadStatisticsStore.cpp */,