- Revision
- 147251
- Author
- beid...@apple.com
- Date
- 2013-03-29 14:32:27 -0700 (Fri, 29 Mar 2013)
Log Message
"Empty cache..." clears the disk cache from each WebProcess.
<rdar://problem/12456652> and https://bugs.webkit.org/show_bug.cgi?id=113603
Reviewed by Sam Weinig.
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::NetworkProcess):
(WebKit::NetworkProcess::terminate): Override ChildProcess::terminate to allow us to finish clearing the cache.
* NetworkProcess/NetworkProcess.h:
* NetworkProcess/NetworkProcess.messages.in: Add the ClearCacheForAllOrigins message.
* NetworkProcess/mac/NetworkProcessMac.mm:
(WebKit::NetworkProcess::clearCacheForAllOrigins): Clear the disk cache.
(WebKit::NetworkProcess::platformTerminate): Wait for the clear to complete.
* UIProcess/WebResourceCacheManagerProxy.cpp:
(WebKit::WebResourceCacheManagerProxy::clearCacheForAllOrigins): Message the network process, also.
* WebProcess/mac/WebProcessMac.mm:
(WebKit::WebProcess::platformClearResourceCaches): Don't clear the disk cache if we use the network process.
Modified Paths
Diff
Modified: trunk/Source/WebKit2/ChangeLog (147250 => 147251)
--- trunk/Source/WebKit2/ChangeLog 2013-03-29 21:13:02 UTC (rev 147250)
+++ trunk/Source/WebKit2/ChangeLog 2013-03-29 21:32:27 UTC (rev 147251)
@@ -1,3 +1,27 @@
+2013-03-29 Brady Eidson <beid...@apple.com>
+
+ "Empty cache..." clears the disk cache from each WebProcess.
+ <rdar://problem/12456652> and https://bugs.webkit.org/show_bug.cgi?id=113603
+
+ Reviewed by Sam Weinig.
+
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::NetworkProcess):
+ (WebKit::NetworkProcess::terminate): Override ChildProcess::terminate to allow us to finish clearing the cache.
+ * NetworkProcess/NetworkProcess.h:
+
+ * NetworkProcess/NetworkProcess.messages.in: Add the ClearCacheForAllOrigins message.
+
+ * NetworkProcess/mac/NetworkProcessMac.mm:
+ (WebKit::NetworkProcess::clearCacheForAllOrigins): Clear the disk cache.
+ (WebKit::NetworkProcess::platformTerminate): Wait for the clear to complete.
+
+ * UIProcess/WebResourceCacheManagerProxy.cpp:
+ (WebKit::WebResourceCacheManagerProxy::clearCacheForAllOrigins): Message the network process, also.
+
+ * WebProcess/mac/WebProcessMac.mm:
+ (WebKit::WebProcess::platformClearResourceCaches): Don't clear the disk cache if we use the network process.
+
2013-03-28 Brady Eidson <beid...@apple.com>
We leak NetworkConnectionToWebProcess objects.
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp (147250 => 147251)
--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp 2013-03-29 21:13:02 UTC (rev 147250)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp 2013-03-29 21:32:27 UTC (rev 147251)
@@ -64,6 +64,9 @@
NetworkProcess::NetworkProcess()
: m_hasSetCacheModel(false)
, m_cacheModel(CacheModelDocumentViewer)
+#if PLATFORM(MAC)
+ , m_clearCacheDispatchGroup(0)
+#endif
{
NetworkProcessPlatformStrategies::initialize();
@@ -238,6 +241,12 @@
parentProcessConnection()->send(Messages::WebContext::DidGetStatistics(data, callbackID), 0);
}
+void NetworkProcess::terminate()
+{
+ platformTerminate();
+ ChildProcess::terminate();
+}
+
#if !PLATFORM(MAC)
void NetworkProcess::initializeProcessName(const ChildProcessInitializationParameters&)
{
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h (147250 => 147251)
--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h 2013-03-29 21:13:02 UTC (rev 147250)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h 2013-03-29 21:32:27 UTC (rev 147251)
@@ -77,6 +77,9 @@
void platformInitializeNetworkProcess(const NetworkProcessCreationParameters&);
+ virtual void terminate() OVERRIDE;
+ void platformTerminate();
+
// ChildProcess
virtual void initializeProcessName(const ChildProcessInitializationParameters&) OVERRIDE;
virtual void initializeSandbox(const ChildProcessInitializationParameters&, SandboxInitializationParameters&) OVERRIDE;
@@ -104,10 +107,9 @@
void downloadRequest(uint64_t downloadID, const WebCore::ResourceRequest&);
void cancelDownload(uint64_t downloadID);
void setCacheModel(uint32_t);
-
void allowSpecificHTTPSCertificateForHost(const PlatformCertificateInfo&, const String& host);
-
void getNetworkProcessStatistics(uint64_t callbackID);
+ void clearCacheForAllOrigins(uint32_t cachesToClear);
// Platform Helpers
void platformSetCacheModel(CacheModel);
@@ -123,6 +125,13 @@
typedef HashMap<const char*, OwnPtr<NetworkProcessSupplement>, PtrHash<const char*> > NetworkProcessSupplementMap;
NetworkProcessSupplementMap m_supplements;
+
+#if PLATFORM(MAC)
+ // FIXME: We'd like to be able to do this without the #ifdef, but WorkQueue + BinarySemaphore isn't good enough since
+ // multiple requests to clear the cache can come in before previous requests complete, and we need to wait for all of them.
+ // In the future using WorkQueue and a counting semaphore would work, as would WorkQueue supporting the libdispatch concept of "work groups".
+ dispatch_group_t m_clearCacheDispatchGroup;
+#endif
};
} // namespace WebKit
Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in (147250 => 147251)
--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in 2013-03-29 21:13:02 UTC (rev 147250)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in 2013-03-29 21:32:27 UTC (rev 147251)
@@ -42,6 +42,8 @@
AllowSpecificHTTPSCertificateForHost(WebKit::PlatformCertificateInfo certificate, WTF::String host)
GetNetworkProcessStatistics(uint64_t callbackID)
+
+ ClearCacheForAllOrigins(uint32_t cachesToClear)
}
#endif // ENABLE(NETWORK_PROCESS)
Modified: trunk/Source/WebKit2/NetworkProcess/mac/NetworkProcessMac.mm (147250 => 147251)
--- trunk/Source/WebKit2/NetworkProcess/mac/NetworkProcessMac.mm 2013-03-29 21:13:02 UTC (rev 147250)
+++ trunk/Source/WebKit2/NetworkProcess/mac/NetworkProcessMac.mm 2013-03-29 21:32:27 UTC (rev 147251)
@@ -31,6 +31,7 @@
#import "NetworkProcessCreationParameters.h"
#import "NetworkResourceLoader.h"
#import "PlatformCertificateInfo.h"
+#import "ResourceCachesToClear.h"
#import "SandboxExtension.h"
#import "SandboxInitializationParameters.h"
#import "StringUtilities.h"
@@ -201,6 +202,29 @@
ChildProcess::initializeSandbox(parameters, sandboxParameters);
}
+void NetworkProcess::clearCacheForAllOrigins(uint32_t cachesToClear)
+{
+ ResourceCachesToClear resourceCachesToClear = static_cast<ResourceCachesToClear>(cachesToClear);
+ if (resourceCachesToClear == InMemoryResourceCachesOnly)
+ return;
+
+ if (!m_clearCacheDispatchGroup)
+ m_clearCacheDispatchGroup = dispatch_group_create();
+
+ dispatch_group_async(m_clearCacheDispatchGroup, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ [[NSURLCache sharedURLCache] removeAllCachedResponses];
+ });
+}
+
+void NetworkProcess::platformTerminate()
+{
+ if (m_clearCacheDispatchGroup) {
+ dispatch_group_wait(m_clearCacheDispatchGroup, DISPATCH_TIME_FOREVER);
+ dispatch_release(m_clearCacheDispatchGroup);
+ m_clearCacheDispatchGroup = 0;
+ }
+}
+
} // namespace WebKit
#endif // ENABLE(NETWORK_PROCESS)
Modified: trunk/Source/WebKit2/UIProcess/WebResourceCacheManagerProxy.cpp (147250 => 147251)
--- trunk/Source/WebKit2/UIProcess/WebResourceCacheManagerProxy.cpp 2013-03-29 21:13:02 UTC (rev 147250)
+++ trunk/Source/WebKit2/UIProcess/WebResourceCacheManagerProxy.cpp 2013-03-29 21:32:27 UTC (rev 147251)
@@ -28,6 +28,7 @@
#include "ImmutableArray.h"
#include "ImmutableDictionary.h"
+#include "NetworkProcessMessages.h"
#include "SecurityOriginData.h"
#include "WebContext.h"
#include "WebResourceCacheManagerMessages.h"
@@ -114,6 +115,8 @@
void WebResourceCacheManagerProxy::clearCacheForAllOrigins(ResourceCachesToClear cachesToClear)
{
+ context()->sendToNetworkingProcessRelaunchingIfNecessary(Messages::NetworkProcess::ClearCacheForAllOrigins(cachesToClear));
+
// FIXME (Multi-WebProcess): <rdar://problem/12239765> There is no need to relaunch all processes. One process to take care of persistent cache is enough.
context()->sendToAllProcessesRelaunchingThemIfNecessary(Messages::WebResourceCacheManager::ClearCacheForAllOrigins(cachesToClear));
}
Modified: trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm (147250 => 147251)
--- trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm 2013-03-29 21:13:02 UTC (rev 147250)
+++ trunk/Source/WebKit2/WebProcess/mac/WebProcessMac.mm 2013-03-29 21:32:27 UTC (rev 147251)
@@ -130,6 +130,10 @@
if (cachesToClear == InMemoryResourceCachesOnly)
return;
+ // If we're using the network process then it is the only one that needs to clear the disk cache.
+ if (usesNetworkProcess())
+ return;
+
if (!m_clearResourceCachesDispatchGroup)
m_clearResourceCachesDispatchGroup = dispatch_group_create();