diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 508c44fbd1..2aed828f53 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include "Application.h" #include "AccountManager.h" @@ -582,8 +584,20 @@ Menu::Menu() { QString("hifi/tablet/TabletNetworkingPreferences.qml"), "NetworkingPreferencesDialog"); }); addActionToQMenuAndActionHash(networkMenu, MenuOption::ReloadContent, 0, qApp, SLOT(reloadResourceCaches())); - addActionToQMenuAndActionHash(networkMenu, MenuOption::ClearDiskCache, 0, - DependencyManager::get().data(), SLOT(clearCache())); + + action = addActionToQMenuAndActionHash(networkMenu, MenuOption::ClearDiskCaches); + connect(action, &QAction::triggered, [] { + // The following caches are cleared immediately + DependencyManager::get()->clearCache(); +#ifndef Q_OS_ANDROID + FileTypeProfile::clearCache(); + HFWebEngineProfile::clearCache(); +#endif + + // Clear the KTX cache on the next restart. It can't be cleared immediately because its files might be in use. + Setting::Handle(KTXCache::SETTING_VERSION_NAME, KTXCache::INVALID_VERSION).set(KTXCache::INVALID_VERSION); + }); + addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::DisableActivityLogger, 0, diff --git a/interface/src/Menu.h b/interface/src/Menu.h index ea118ec5dd..3d3c8f9d35 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -56,7 +56,7 @@ namespace MenuOption { const QString CalibrateCamera = "Calibrate Camera"; const QString CenterPlayerInView = "Center Player In View"; const QString Chat = "Chat..."; - const QString ClearDiskCache = "Clear Disk Cache"; + const QString ClearDiskCaches = "Clear Disk Caches (requires restart)"; const QString Collisions = "Collisions"; const QString Connexion = "Activate 3D Connexion Devices"; const QString Console = "Console..."; diff --git a/libraries/ui/src/ui/types/FileTypeProfile.cpp b/libraries/ui/src/ui/types/FileTypeProfile.cpp index 615e80b85c..3b9ed74200 100644 --- a/libraries/ui/src/ui/types/FileTypeProfile.cpp +++ b/libraries/ui/src/ui/types/FileTypeProfile.cpp @@ -11,6 +11,8 @@ #include "FileTypeProfile.h" +#include +#include #include #include "RequestFilters.h" @@ -18,14 +20,28 @@ #if !defined(Q_OS_ANDROID) static const QString QML_WEB_ENGINE_STORAGE_NAME = "qmlWebEngine"; +static std::set FileTypeProfile_instances; +static std::mutex FileTypeProfile_mutex; + FileTypeProfile::FileTypeProfile(QQmlContext* parent) : ContextAwareProfile(parent) { static const QString WEB_ENGINE_USER_AGENT = "Chrome/48.0 (HighFidelityInterface)"; setHttpUserAgent(WEB_ENGINE_USER_AGENT); + setStorageName(QML_WEB_ENGINE_STORAGE_NAME); + setOffTheRecord(false); + auto requestInterceptor = new RequestInterceptor(this); setRequestInterceptor(requestInterceptor); + + std::lock_guard lock(FileTypeProfile_mutex); + FileTypeProfile_instances.insert(this); +} + +FileTypeProfile::~FileTypeProfile() { + std::lock_guard lock(FileTypeProfile_mutex); + FileTypeProfile_instances.erase(this); } void FileTypeProfile::RequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo& info) { @@ -37,5 +53,11 @@ void FileTypeProfile::registerWithContext(QQmlContext* context) { context->setContextProperty("FileTypeProfile", new FileTypeProfile(context)); } +void FileTypeProfile::clearCache() { + std::lock_guard lock(FileTypeProfile_mutex); + foreach (auto instance, FileTypeProfile_instances) { + instance->clearHttpCache(); + } +} #endif \ No newline at end of file diff --git a/libraries/ui/src/ui/types/FileTypeProfile.h b/libraries/ui/src/ui/types/FileTypeProfile.h index 7ddfdd0aed..8d8b921846 100644 --- a/libraries/ui/src/ui/types/FileTypeProfile.h +++ b/libraries/ui/src/ui/types/FileTypeProfile.h @@ -25,8 +25,12 @@ class FileTypeProfile : public ContextAwareProfile { public: static void registerWithContext(QQmlContext* parent); + static void clearCache(); + protected: FileTypeProfile(QQmlContext* parent); + virtual ~FileTypeProfile(); + class RequestInterceptor : public Parent::RequestInterceptor { public: RequestInterceptor(ContextAwareProfile* parent) : Parent::RequestInterceptor(parent) {} diff --git a/libraries/ui/src/ui/types/HFWebEngineProfile.cpp b/libraries/ui/src/ui/types/HFWebEngineProfile.cpp index 3c5701cc52..3f2d50e8fa 100644 --- a/libraries/ui/src/ui/types/HFWebEngineProfile.cpp +++ b/libraries/ui/src/ui/types/HFWebEngineProfile.cpp @@ -11,6 +11,8 @@ #include "HFWebEngineProfile.h" +#include +#include #include #include "RequestFilters.h" @@ -19,12 +21,24 @@ static const QString QML_WEB_ENGINE_STORAGE_NAME = "qmlWebEngine"; +static std::set HFWebEngineProfile_instances; +static std::mutex HFWebEngineProfile_mutex; + HFWebEngineProfile::HFWebEngineProfile(QQmlContext* parent) : Parent(parent) { setStorageName(QML_WEB_ENGINE_STORAGE_NAME); + setOffTheRecord(false); // we use the HFWebEngineRequestInterceptor to make sure that web requests are authenticated for the interface user setRequestInterceptor(new RequestInterceptor(this)); + + std::lock_guard lock(HFWebEngineProfile_mutex); + HFWebEngineProfile_instances.insert(this); +} + +HFWebEngineProfile::~HFWebEngineProfile() { + std::lock_guard lock(HFWebEngineProfile_mutex); + HFWebEngineProfile_instances.erase(this); } void HFWebEngineProfile::RequestInterceptor::interceptRequest(QWebEngineUrlRequestInfo& info) { @@ -35,4 +49,11 @@ void HFWebEngineProfile::registerWithContext(QQmlContext* context) { context->setContextProperty("HFWebEngineProfile", new HFWebEngineProfile(context)); } +void HFWebEngineProfile::clearCache() { + std::lock_guard lock(HFWebEngineProfile_mutex); + foreach (auto instance, HFWebEngineProfile_instances) { + instance->clearHttpCache(); + } +} + #endif diff --git a/libraries/ui/src/ui/types/HFWebEngineProfile.h b/libraries/ui/src/ui/types/HFWebEngineProfile.h index 6b84ad6f80..872cb31901 100644 --- a/libraries/ui/src/ui/types/HFWebEngineProfile.h +++ b/libraries/ui/src/ui/types/HFWebEngineProfile.h @@ -23,8 +23,12 @@ class HFWebEngineProfile : public ContextAwareProfile { public: static void registerWithContext(QQmlContext* parent); + static void clearCache(); + protected: HFWebEngineProfile(QQmlContext* parent); + virtual ~HFWebEngineProfile(); + class RequestInterceptor : public Parent::RequestInterceptor { public: RequestInterceptor(ContextAwareProfile* parent) : Parent::RequestInterceptor(parent) {}