summaryrefslogtreecommitdiff
path: root/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp')
-rw-r--r--Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp149
1 files changed, 85 insertions, 64 deletions
diff --git a/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp b/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp
index 5730ca61c..d8dcde330 100644
--- a/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp
+++ b/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp
@@ -25,72 +25,100 @@
*/
#include "config.h"
-#if ENABLE(NETWORK_PROCESS)
#include "NetworkProcess.h"
+#include "NetworkCache.h"
#include "NetworkProcessCreationParameters.h"
#include "ResourceCachesToClear.h"
#include "WebCookieManager.h"
#include <WebCore/CertificateInfo.h>
#include <WebCore/FileSystem.h>
+#include <WebCore/NetworkStorageSession.h>
#include <WebCore/NotImplemented.h>
#include <WebCore/ResourceHandle.h>
#include <WebCore/SoupNetworkSession.h>
#include <libsoup/soup.h>
-#include <wtf/gobject/GRefPtr.h>
-#include <wtf/gobject/GUniquePtr.h>
+#include <wtf/RAMSize.h>
+#include <wtf/glib/GRefPtr.h>
+#include <wtf/glib/GUniquePtr.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/StringBuilder.h>
using namespace WebCore;
namespace WebKit {
-static uint64_t getCacheDiskFreeSize(SoupCache* cache)
+static CString buildAcceptLanguages(const Vector<String>& languages)
{
- ASSERT(cache);
-
- GUniqueOutPtr<char> cacheDir;
- g_object_get(G_OBJECT(cache), "cache-dir", &cacheDir.outPtr(), NULL);
- if (!cacheDir)
- return 0;
-
- return WebCore::getVolumeFreeSizeForPath(cacheDir.get());
-}
+ size_t languagesCount = languages.size();
+
+ // Ignore "C" locale.
+ size_t cLocalePosition = languages.find("c");
+ if (cLocalePosition != notFound)
+ languagesCount--;
+
+ // Fallback to "en" if the list is empty.
+ if (!languagesCount)
+ return "en";
+
+ // Calculate deltas for the quality values.
+ int delta;
+ if (languagesCount < 10)
+ delta = 10;
+ else if (languagesCount < 20)
+ delta = 5;
+ else
+ delta = 1;
+
+ // Set quality values for each language.
+ StringBuilder builder;
+ for (size_t i = 0; i < languages.size(); ++i) {
+ if (i == cLocalePosition)
+ continue;
+
+ if (i)
+ builder.appendLiteral(", ");
+
+ builder.append(languages[i]);
+
+ int quality = 100 - i * delta;
+ if (quality > 0 && quality < 100) {
+ char buffer[8];
+ g_ascii_formatd(buffer, 8, "%.2f", quality / 100.0);
+ builder.append(String::format(";q=%s", buffer));
+ }
+ }
-static uint64_t getMemorySize()
-{
- static uint64_t kDefaultMemorySize = 512;
-#if !OS(WINDOWS)
- long pageSize = sysconf(_SC_PAGESIZE);
- if (pageSize == -1)
- return kDefaultMemorySize;
-
- long physPages = sysconf(_SC_PHYS_PAGES);
- if (physPages == -1)
- return kDefaultMemorySize;
-
- return ((pageSize / 1024) * physPages) / 1024;
-#else
- // Fallback to default for other platforms.
- return kDefaultMemorySize;
-#endif
+ return builder.toString().utf8();
}
void NetworkProcess::userPreferredLanguagesChanged(const Vector<String>& languages)
{
- SoupNetworkSession::defaultSession().setAcceptLanguages(languages);
+ auto acceptLanguages = buildAcceptLanguages(languages);
+ SoupNetworkSession::setInitialAcceptLanguages(acceptLanguages);
+ NetworkStorageSession::forEach([&acceptLanguages](const WebCore::NetworkStorageSession& session) {
+ if (auto* soupSession = session.soupNetworkSession())
+ soupSession->setAcceptLanguages(acceptLanguages);
+ });
}
void NetworkProcess::platformInitializeNetworkProcess(const NetworkProcessCreationParameters& parameters)
{
+ if (parameters.proxySettings.mode != SoupNetworkProxySettings::Mode::Default)
+ setNetworkProxySettings(parameters.proxySettings);
+
ASSERT(!parameters.diskCacheDirectory.isEmpty());
- GRefPtr<SoupCache> soupCache = adoptGRef(soup_cache_new(parameters.diskCacheDirectory.utf8().data(), SOUP_CACHE_SINGLE_USER));
- SoupNetworkSession::defaultSession().setCache(soupCache.get());
- // Set an initial huge max_size for the SoupCache so the call to soup_cache_load() won't evict any cached
- // resource. The final size of the cache will be set by NetworkProcess::platformSetCacheModel().
- unsigned initialMaxSize = soup_cache_get_max_size(soupCache.get());
- soup_cache_set_max_size(soupCache.get(), G_MAXUINT);
- soup_cache_load(soupCache.get());
- soup_cache_set_max_size(soupCache.get(), initialMaxSize);
+ m_diskCacheDirectory = parameters.diskCacheDirectory;
+
+ SoupNetworkSession::clearOldSoupCache(WebCore::directoryName(m_diskCacheDirectory));
+
+ NetworkCache::Cache::Parameters cacheParameters {
+ parameters.shouldEnableNetworkCacheEfficacyLogging
+#if ENABLE(NETWORK_CACHE_SPECULATIVE_REVALIDATION)
+ , parameters.shouldEnableNetworkCacheSpeculativeRevalidation
+#endif
+ };
+ NetworkCache::singleton().initialize(m_diskCacheDirectory, cacheParameters);
if (!parameters.cookiePersistentStoragePath.isEmpty()) {
supplement<WebCookieManager>()->setCookiePersistentStorage(parameters.cookiePersistentStoragePath,
@@ -104,37 +132,18 @@ void NetworkProcess::platformInitializeNetworkProcess(const NetworkProcessCreati
setIgnoreTLSErrors(parameters.ignoreTLSErrors);
}
-void NetworkProcess::platformSetCacheModel(CacheModel cacheModel)
+void NetworkProcess::platformSetURLCacheSize(unsigned, uint64_t)
{
- unsigned cacheTotalCapacity = 0;
- unsigned cacheMinDeadCapacity = 0;
- unsigned cacheMaxDeadCapacity = 0;
- double deadDecodedDataDeletionInterval = 0;
- unsigned pageCacheCapacity = 0;
-
- unsigned long urlCacheMemoryCapacity = 0;
- unsigned long urlCacheDiskCapacity = 0;
-
- SoupCache* cache = SoupNetworkSession::defaultSession().cache();
- uint64_t diskFreeSize = getCacheDiskFreeSize(cache) / 1024 / 1024;
-
- uint64_t memSize = getMemorySize();
- calculateCacheSizes(cacheModel, memSize, diskFreeSize,
- cacheTotalCapacity, cacheMinDeadCapacity, cacheMaxDeadCapacity, deadDecodedDataDeletionInterval,
- pageCacheCapacity, urlCacheMemoryCapacity, urlCacheDiskCapacity);
-
- if (urlCacheDiskCapacity > soup_cache_get_max_size(cache))
- soup_cache_set_max_size(cache, urlCacheDiskCapacity);
}
void NetworkProcess::setIgnoreTLSErrors(bool ignoreTLSErrors)
{
- ResourceHandle::setIgnoreSSLErrors(ignoreTLSErrors);
+ SoupNetworkSession::setShouldIgnoreTLSErrors(ignoreTLSErrors);
}
void NetworkProcess::allowSpecificHTTPSCertificateForHost(const CertificateInfo& certificateInfo, const String& host)
{
- ResourceHandle::setClientCertificate(host, certificateInfo.certificate());
+ SoupNetworkSession::allowSpecificHTTPSCertificateForHost(certificateInfo, host);
}
void NetworkProcess::clearCacheForAllOrigins(uint32_t cachesToClear)
@@ -142,7 +151,12 @@ void NetworkProcess::clearCacheForAllOrigins(uint32_t cachesToClear)
if (cachesToClear == InMemoryResourceCachesOnly)
return;
- soup_cache_clear(SoupNetworkSession::defaultSession().cache());
+ clearDiskCache(std::chrono::system_clock::time_point::min(), [] { });
+}
+
+void NetworkProcess::clearDiskCache(std::chrono::system_clock::time_point modifiedSince, std::function<void ()> completionHandler)
+{
+ NetworkCache::singleton().clear(modifiedSince, WTFMove(completionHandler));
}
void NetworkProcess::platformTerminate()
@@ -150,6 +164,13 @@ void NetworkProcess::platformTerminate()
notImplemented();
}
-} // namespace WebKit
+void NetworkProcess::setNetworkProxySettings(const SoupNetworkProxySettings& settings)
+{
+ SoupNetworkSession::setProxySettings(settings);
+ NetworkStorageSession::forEach([](const NetworkStorageSession& session) {
+ if (auto* soupSession = session.soupNetworkSession())
+ soupSession->setupProxy();
+ });
+}
-#endif
+} // namespace WebKit