Laying some groundwork to fetch performance statistics from WebProcess.
authoradachan@apple.com <adachan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Aug 2011 22:09:21 +0000 (22:09 +0000)
committeradachan@apple.com <adachan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 30 Aug 2011 22:09:21 +0000 (22:09 +0000)
https://bugs.webkit.org/show_bug.cgi?id=67160

Reviewed by Darin Adler.

Add WKContextGetStatistics() which sends a message to WebProcess to fetch the performance statistics.
* UIProcess/API/C/WKContext.cpp:
(WKContextGetStatistics):
* UIProcess/API/C/WKContext.h:
* UIProcess/WebContext.cpp:
(WebKit::WebContext::~WebContext):
(WebKit::WebContext::getWebCoreStatistics):
(WebKit::WebContext::didGetWebCoreStatistics):
* UIProcess/WebContext.h:
* UIProcess/WebContext.messages.in: Add the DidGetWebCoreStatistics message that WebProcess can send when it has
the performance statistics ready.

Add WebProcess::getWebCoreStatistics().  Currently it just sends back an empty StatisticsData object.
It will gather the performance statistics to store in the StatisticsData object in a future patch.
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::getWebCoreStatistics):
* WebProcess/WebProcess.h:
* WebProcess/WebProcess.messages.in:

Add the skeleton for StatisticsData.
* Scripts/webkit2/messages.py:
* Shared/StatisticsData.cpp: Added.
(WebKit::StatisticsData::encode):
(WebKit::StatisticsData::decode):
(WebKit::StatisticsData::StatisticsData):
* Shared/StatisticsData.h: Added.

Add StatisticsData.h/cpp to project.
* CMakeLists.txt:
* GNUmakefile.am:
* WebKit2.pro:
* WebKit2.xcodeproj/project.pbxproj:
* win/WebKit2.vcproj:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@94115 268f45cc-cd09-0410-ab3c-d52691b4dbfc

17 files changed:
Source/WebKit2/CMakeLists.txt
Source/WebKit2/ChangeLog
Source/WebKit2/GNUmakefile.am
Source/WebKit2/Scripts/webkit2/messages.py
Source/WebKit2/Shared/StatisticsData.cpp [new file with mode: 0644]
Source/WebKit2/Shared/StatisticsData.h [new file with mode: 0644]
Source/WebKit2/UIProcess/API/C/WKContext.cpp
Source/WebKit2/UIProcess/API/C/WKContext.h
Source/WebKit2/UIProcess/WebContext.cpp
Source/WebKit2/UIProcess/WebContext.h
Source/WebKit2/UIProcess/WebContext.messages.in
Source/WebKit2/WebKit2.pro
Source/WebKit2/WebKit2.xcodeproj/project.pbxproj
Source/WebKit2/WebProcess/WebProcess.cpp
Source/WebKit2/WebProcess/WebProcess.h
Source/WebKit2/WebProcess/WebProcess.messages.in
Source/WebKit2/win/WebKit2.vcproj

index 7342876..11aa6dd 100644 (file)
@@ -150,6 +150,7 @@ SET(WebKit2_SOURCES
 
     Shared/SecurityOriginData.cpp
     Shared/SessionState.cpp
+    Shared/StatisticsData.cpp
     Shared/UpdateInfo.cpp
     Shared/VisitedLinkTable.cpp
     Shared/WebBackForwardListItem.cpp
index 8ce56e4..ff1a68c 100644 (file)
@@ -1,3 +1,44 @@
+2011-08-30  Ada Chan  <adachan@apple.com>
+
+        Laying some groundwork to fetch performance statistics from WebProcess.
+        https://bugs.webkit.org/show_bug.cgi?id=67160
+
+        Reviewed by Darin Adler.
+
+        Add WKContextGetStatistics() which sends a message to WebProcess to fetch the performance statistics.
+        * UIProcess/API/C/WKContext.cpp:
+        (WKContextGetStatistics):
+        * UIProcess/API/C/WKContext.h:
+        * UIProcess/WebContext.cpp:
+        (WebKit::WebContext::~WebContext):
+        (WebKit::WebContext::getWebCoreStatistics):
+        (WebKit::WebContext::didGetWebCoreStatistics):
+        * UIProcess/WebContext.h:
+        * UIProcess/WebContext.messages.in: Add the DidGetWebCoreStatistics message that WebProcess can send when it has
+        the performance statistics ready.
+
+        Add WebProcess::getWebCoreStatistics().  Currently it just sends back an empty StatisticsData object.
+        It will gather the performance statistics to store in the StatisticsData object in a future patch.
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::getWebCoreStatistics):
+        * WebProcess/WebProcess.h:
+        * WebProcess/WebProcess.messages.in:
+
+        Add the skeleton for StatisticsData.
+        * Scripts/webkit2/messages.py:
+        * Shared/StatisticsData.cpp: Added.
+        (WebKit::StatisticsData::encode):
+        (WebKit::StatisticsData::decode):
+        (WebKit::StatisticsData::StatisticsData):
+        * Shared/StatisticsData.h: Added.
+
+        Add StatisticsData.h/cpp to project.
+        * CMakeLists.txt:
+        * GNUmakefile.am:
+        * WebKit2.pro:
+        * WebKit2.xcodeproj/project.pbxproj:
+        * win/WebKit2.vcproj:
+
 2011-08-29  Alexey Proskuryakov  <ap@apple.com>
 
         DumpRenderTree should begin each test with an empty cookie store
index 5860e1a..2c94f00 100644 (file)
@@ -316,6 +316,8 @@ libwebkit2gtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_SOU
        Source/WebKit2/Shared/SecurityOriginData.cpp \
        Source/WebKit2/Shared/SessionState.cpp \
        Source/WebKit2/Shared/SessionState.h \
+       Source/WebKit2/Shared/StatisticsData.cpp \
+       Source/WebKit2/Shared/StatisticsData.h \
        Source/WebKit2/Shared/StringPairVector.h \
        Source/WebKit2/Shared/TextCheckerState.h \
        Source/WebKit2/Shared/UserMessageCoders.h \
index bebf8a1..1653550 100644 (file)
@@ -285,6 +285,7 @@ def struct_or_class(namespace, type):
         'WebKit::PluginProcessCreationParameters',
         'WebKit::PrintInfo',
         'WebKit::SecurityOriginData',
+        'WebKit::StatisticsData',
         'WebKit::TextCheckerState',
         'WebKit::WebNavigationDataStore',
         'WebKit::WebOpenPanelParameters::Data',
diff --git a/Source/WebKit2/Shared/StatisticsData.cpp b/Source/WebKit2/Shared/StatisticsData.cpp
new file mode 100644 (file)
index 0000000..3e8243b
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2011 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 "StatisticsData.h"
+
+#include "WebCoreArgumentCoders.h"
+
+namespace WebKit {
+
+void StatisticsData::encode(CoreIPC::ArgumentEncoder* encoder) const
+{
+    // FIXME: To be implemented.
+}
+
+bool StatisticsData::decode(CoreIPC::ArgumentDecoder* decoder, StatisticsData& statisticsData)
+{
+    // FIXME: To be implemented.
+    return true;
+}
+
+StatisticsData::StatisticsData()
+{    
+    // FIXME: To be implemented.
+}
+
+} // namespace WebKit
diff --git a/Source/WebKit2/Shared/StatisticsData.h b/Source/WebKit2/Shared/StatisticsData.h
new file mode 100644 (file)
index 0000000..79fb841
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+#ifndef StatisticsData_h
+#define StatisticsData_h
+
+#include "ArgumentDecoder.h"
+#include "ArgumentEncoder.h"
+
+namespace WebKit {
+
+struct StatisticsData {
+    void encode(CoreIPC::ArgumentEncoder*) const;
+    static bool decode(CoreIPC::ArgumentDecoder*, StatisticsData&);
+    
+    StatisticsData();
+};
+
+} // namespace WebKit
+
+#endif // StatisticsData_h
index 1f3d966..56b4fd0 100644 (file)
@@ -232,3 +232,8 @@ void WKContextWarmInitialProcess(WKContextRef contextRef)
     toImpl(contextRef)->warmInitialProcess();
 }
 
+void WKContextGetStatistics(WKContextRef contextRef, void* context, WKContextGetStatisticsFunction callback)
+{
+    toImpl(contextRef)->getWebCoreStatistics(DictionaryCallback::create(context, callback));    
+}
+
index cd289c9..876c09d 100644 (file)
@@ -137,6 +137,9 @@ WK_EXPORT WKKeyValueStorageManagerRef WKContextGetKeyValueStorageManager(WKConte
 WK_EXPORT WKMediaCacheManagerRef WKContextGetMediaCacheManager(WKContextRef context);
 WK_EXPORT WKPluginSiteDataManagerRef WKContextGetPluginSiteDataManager(WKContextRef context);
 WK_EXPORT WKResourceCacheManagerRef WKContextGetResourceCacheManager(WKContextRef context);
+    
+typedef void (*WKContextGetStatisticsFunction)(WKDictionaryRef statistics, WKErrorRef error, void* functionContext);
+WK_EXPORT void WKContextGetStatistics(WKContextRef context, void* functionContext, WKContextGetStatisticsFunction function);
 
 #ifdef __cplusplus
 }
index a1b4e4e..3b0c3f3 100644 (file)
@@ -181,6 +181,8 @@ WebContext::~WebContext()
 
     m_resourceCacheManagerProxy->invalidate();
     m_resourceCacheManagerProxy->clearContext();
+    
+    invalidateCallbackMap(m_dictionaryCallbacks);
 
     platformInvalidateContext();
     
@@ -785,4 +787,26 @@ bool WebContext::httpPipeliningEnabled()
 #endif
 }
 
+void WebContext::getWebCoreStatistics(PassRefPtr<DictionaryCallback> prpCallback)
+{
+    RefPtr<DictionaryCallback> callback = prpCallback;
+    
+    uint64_t callbackID = callback->callbackID();
+    m_dictionaryCallbacks.set(callbackID, callback.get());
+    process()->send(Messages::WebProcess::GetWebCoreStatistics(callbackID), 0);
+}
+
+void WebContext::didGetWebCoreStatistics(const StatisticsData& statisticsData, uint64_t callbackID)
+{
+    RefPtr<DictionaryCallback> callback = m_dictionaryCallbacks.take(callbackID);
+    if (!callback) {
+        // FIXME: Log error or assert.
+        return;
+    }
+     
+    // FIXME: Store statistics data into a dictionary.
+    RefPtr<ImmutableDictionary> statistics = ImmutableDictionary::create();
+    callback->performCallbackWithReturnValue(statistics.get());
+}
+    
 } // namespace WebKit
index 9f1cf28..79ff657 100644 (file)
@@ -27,6 +27,7 @@
 #define WebContext_h
 
 #include "APIObject.h"
+#include "GenericCallback.h"
 #include "PluginInfoStore.h"
 #include "ProcessModel.h"
 #include "VisitedLinkProvider.h"
@@ -55,7 +56,10 @@ class WebMediaCacheManagerProxy;
 class WebPageGroup;
 class WebPageProxy;
 class WebResourceCacheManagerProxy;
+struct StatisticsData;
 struct WebProcessCreationParameters;
+    
+typedef GenericCallback<WKDictionaryRef> DictionaryCallback;
 
 class WebContext : public APIObject {
 public:
@@ -175,6 +179,8 @@ public:
     // Defaults to false.
     void setHTTPPipeliningEnabled(bool);
     bool httpPipeliningEnabled();
+    
+    void getWebCoreStatistics(PassRefPtr<DictionaryCallback>);
 
 private:
     WebContext(ProcessModel, const String& injectedBundlePath);
@@ -197,6 +203,8 @@ private:
     void didGetSitesWithPluginData(const Vector<String>& sites, uint64_t callbackID);
     void didClearPluginSiteData(uint64_t callbackID);
 #endif
+    
+    void didGetWebCoreStatistics(const StatisticsData&, uint64_t callbackID);
         
     // Implemented in generated WebContextMessageReceiver.cpp
     void didReceiveWebContextMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
@@ -270,6 +278,8 @@ private:
     String m_overrideLocalStorageDirectory;
 
     bool m_processTerminationEnabled;
+    
+    HashMap<uint64_t, RefPtr<DictionaryCallback> > m_dictionaryCallbacks;
 };
 
 template<typename U> inline bool WebContext::sendToAllProcesses(const U& message)
index a086813..954894f 100644 (file)
@@ -40,4 +40,6 @@ messages -> WebContext {
     void DidClearPluginSiteData(uint64_t callbackID)
 #endif
 
+    DidGetWebCoreStatistics(WebKit::StatisticsData statisticsData, uint64_t callbackID)
+
 }
index c33d319..6390a32 100644 (file)
@@ -135,6 +135,7 @@ HEADERS += \
     Shared/SameDocumentNavigationType.h \
     Shared/SecurityOriginData.h \
     Shared/SessionState.h \
+    Shared/StatisticsData.h \
     Shared/StringPairVector.h \
     Shared/UpdateInfo.h \
     Shared/UserMessageCoders.h \
@@ -368,6 +369,7 @@ SOURCES += \
     Shared/PrintInfo.cpp \
     Shared/SecurityOriginData.cpp \
     Shared/SessionState.cpp \
+    Shared/StatisticsData.cpp \
     Shared/UpdateInfo.cpp \
     Shared/VisitedLinkTable.cpp \
     Shared/WebBackForwardListItem.cpp \
index 369ebbd..914da3a 100644 (file)
                51D130551382EAC000351EDD /* SecItemResponseData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51D130511382EAC000351EDD /* SecItemResponseData.cpp */; };
                51D130561382EAC000351EDD /* SecItemResponseData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51D130521382EAC000351EDD /* SecItemResponseData.h */; };
                51D130581382F10500351EDD /* WebProcessProxyMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51D130571382F10500351EDD /* WebProcessProxyMac.mm */; };
+               5272B28A1406985D0096A5D0 /* StatisticsData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5272B2881406985D0096A5D0 /* StatisticsData.cpp */; };
+               5272B28B1406985D0096A5D0 /* StatisticsData.h in Headers */ = {isa = PBXBuildFile; fileRef = 5272B2891406985D0096A5D0 /* StatisticsData.h */; };
                5D51845513BCF9CC00C7FF4A /* APIClientTraits.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5D51845313BCF9CC00C7FF4A /* APIClientTraits.cpp */; };
                5D51845613BCF9CC00C7FF4A /* APIClientTraits.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D51845413BCF9CC00C7FF4A /* APIClientTraits.h */; };
                6501BD1A12F1243400E9F248 /* WKBundleInspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65B86F1712F11D7B00B7DD8A /* WKBundleInspector.cpp */; };
                51D130511382EAC000351EDD /* SecItemResponseData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SecItemResponseData.cpp; sourceTree = "<group>"; };
                51D130521382EAC000351EDD /* SecItemResponseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecItemResponseData.h; sourceTree = "<group>"; };
                51D130571382F10500351EDD /* WebProcessProxyMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebProcessProxyMac.mm; sourceTree = "<group>"; };
+               5272B2881406985D0096A5D0 /* StatisticsData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StatisticsData.cpp; sourceTree = "<group>"; };
+               5272B2891406985D0096A5D0 /* StatisticsData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatisticsData.h; sourceTree = "<group>"; };
                5D51845313BCF9CC00C7FF4A /* APIClientTraits.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = APIClientTraits.cpp; sourceTree = "<group>"; };
                5D51845413BCF9CC00C7FF4A /* APIClientTraits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIClientTraits.h; sourceTree = "<group>"; };
                5DAD7294116FF70B00EE5396 /* WebProcess.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = WebProcess.xcconfig; sourceTree = "<group>"; };
                                518D2CC912D51DFB003BB93B /* SessionState.h */,
                                1A6420E212DCE2FF00CAAE2C /* ShareableBitmap.cpp */,
                                1A6420E312DCE2FF00CAAE2C /* ShareableBitmap.h */,
+                               5272B2881406985D0096A5D0 /* StatisticsData.cpp */,
+                               5272B2891406985D0096A5D0 /* StatisticsData.h */,
                                BCBD3C3A125BFA7A00D2C29F /* StringPairVector.h */,
                                1A5E4DA312D3BD3D0099A2BB /* TextCheckerState.h */,
                                1A64245D12DE29A100CAAE2C /* UpdateInfo.cpp */,
                                1A3D610213A7CC2A00F95D4E /* PluginModuleInfo.h in Headers */,
                                5D51845613BCF9CC00C7FF4A /* APIClientTraits.h in Headers */,
                                1A9FBA8D13FF04E600DEED67 /* PluginComplexTextInputState.h in Headers */,
+                               5272B28B1406985D0096A5D0 /* StatisticsData.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                                1A3D610113A7CC2A00F95D4E /* PluginModuleInfo.cpp in Sources */,
                                1A3D610513A7F03A00F95D4E /* ArgumentCoders.cpp in Sources */,
                                5D51845513BCF9CC00C7FF4A /* APIClientTraits.cpp in Sources */,
+                               5272B28A1406985D0096A5D0 /* StatisticsData.cpp in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
index ea7d12f..fde5693 100644 (file)
@@ -33,6 +33,7 @@
 #include "InjectedBundleUserMessageCoders.h"
 #include "RunLoop.h"
 #include "SandboxExtension.h"
+#include "StatisticsData.h"
 #include "WebApplicationCacheManager.h"
 #include "WebContextMessages.h"
 #include "WebCookieManager.h"
@@ -816,6 +817,15 @@ void WebProcess::clearPluginSiteData(const Vector<String>& pluginPaths, const Ve
     m_connection->send(Messages::WebContext::DidClearPluginSiteData(callbackID), 0);
 }
 #endif
+    
+void WebProcess::getWebCoreStatistics(uint64_t callbackID)
+{
+    StatisticsData data;
+    
+    // FIXME: Gather performance data.
+    
+    m_connection->send(Messages::WebContext::DidGetWebCoreStatistics(data, callbackID), 0);
+}
 
 #if ENABLE(PLUGIN_PROCESS)
 void WebProcess::pluginProcessCrashed(const String& pluginPath)
index 7e4d410..0c5632f 100644 (file)
@@ -176,6 +176,8 @@ private:
     void cancelDownload(uint64_t downloadID);
 
     void setTextCheckerState(const TextCheckerState&);
+    
+    void getWebCoreStatistics(uint64_t callbackID);
 
     // ChildProcess
     virtual bool shouldTerminate();
index a7ad563..fd666e6 100644 (file)
@@ -67,4 +67,6 @@ messages -> WebProcess {
     SetTextCheckerState(WebKit::TextCheckerState textCheckerState)
 
     SetEnhancedAccessibility(bool flag)
+
+    GetWebCoreStatistics(uint64_t callbackID)
 }
index 4098e81..e0b0599 100755 (executable)
                                >
                        </File>
                        <File
+                               RelativePath="..\Shared\StatisticsData.cpp"
+                               >
+                       </File>
+                       <File
+                               RelativePath="..\Shared\StatisticsData.h"
+                               >
+                       </File>
+                       <File
                                RelativePath="..\Shared\StringPairVector.h"
                                >
                        </File>