diff options
Diffstat (limited to 'Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp')
-rw-r--r-- | Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp | 149 |
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 |