diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/WebPreferences.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/WebPreferences.cpp | 225 |
1 files changed, 192 insertions, 33 deletions
diff --git a/Source/WebKit2/UIProcess/WebPreferences.cpp b/Source/WebKit2/UIProcess/WebPreferences.cpp index a4c4b796a..dc33bfeae 100644 --- a/Source/WebKit2/UIProcess/WebPreferences.cpp +++ b/Source/WebKit2/UIProcess/WebPreferences.cpp @@ -26,62 +26,90 @@ #include "config.h" #include "WebPreferences.h" -#include "WebContext.h" #include "WebPageGroup.h" +#include "WebPreferencesKeys.h" +#include "WebProcessPool.h" +#include <wtf/NeverDestroyed.h> #include <wtf/ThreadingPrimitives.h> namespace WebKit { // FIXME: Manipulating this variable is not thread safe. // Instead of tracking private browsing state as a boolean preference, we should let the client provide storage sessions explicitly. -static unsigned privateBrowsingPageGroupCount; +static unsigned privateBrowsingPageCount; -WebPreferences::WebPreferences() +Ref<WebPreferences> WebPreferences::create(const String& identifier, const String& keyPrefix, const String& globalDebugKeyPrefix) { - platformInitializeStore(); + return adoptRef(*new WebPreferences(identifier, keyPrefix, globalDebugKeyPrefix)); } -WebPreferences::WebPreferences(const String& identifier) +PassRefPtr<WebPreferences> WebPreferences::createWithLegacyDefaults(const String& identifier, const String& keyPrefix, const String& globalDebugKeyPrefix) +{ + auto preferences = WebPreferences::create(identifier, keyPrefix, globalDebugKeyPrefix); + // FIXME: The registerDefault...ValueForKey machinery is unnecessarily heavyweight and complicated. + // We can just compute different defaults for modern and legacy APIs in WebPreferencesDefinitions.h macros. + preferences->registerDefaultBoolValueForKey(WebPreferencesKey::javaEnabledKey(), true); + preferences->registerDefaultBoolValueForKey(WebPreferencesKey::javaEnabledForLocalFilesKey(), true); + preferences->registerDefaultBoolValueForKey(WebPreferencesKey::pluginsEnabledKey(), true); + preferences->registerDefaultUInt32ValueForKey(WebPreferencesKey::storageBlockingPolicyKey(), WebCore::SecurityOrigin::AllowAllStorage); + return WTFMove(preferences); +} + +WebPreferences::WebPreferences(const String& identifier, const String& keyPrefix, const String& globalDebugKeyPrefix) : m_identifier(identifier) + , m_keyPrefix(keyPrefix) + , m_globalDebugKeyPrefix(globalDebugKeyPrefix) { platformInitializeStore(); } WebPreferences::WebPreferences(const WebPreferences& other) - : m_store(other.m_store) + : m_keyPrefix(other.m_keyPrefix) + , m_globalDebugKeyPrefix(other.m_globalDebugKeyPrefix) + , m_store(other.m_store) { platformInitializeStore(); } WebPreferences::~WebPreferences() { - ASSERT(m_pageGroups.isEmpty()); + ASSERT(m_pages.isEmpty()); } -void WebPreferences::addPageGroup(WebPageGroup* pageGroup) +PassRefPtr<WebPreferences> WebPreferences::copy() const { - bool didAddPageGroup = m_pageGroups.add(pageGroup).isNewEntry; - if (didAddPageGroup && privateBrowsingEnabled()) { - if (!privateBrowsingPageGroupCount) - WebContext::willStartUsingPrivateBrowsing(); - ++privateBrowsingPageGroupCount; + return adoptRef(*new WebPreferences(*this)); +} + +void WebPreferences::addPage(WebPageProxy& webPageProxy) +{ + ASSERT(!m_pages.contains(&webPageProxy)); + m_pages.add(&webPageProxy); + + if (privateBrowsingEnabled()) { + if (!privateBrowsingPageCount) + WebProcessPool::willStartUsingPrivateBrowsing(); + + ++privateBrowsingPageCount; } } -void WebPreferences::removePageGroup(WebPageGroup* pageGroup) +void WebPreferences::removePage(WebPageProxy& webPageProxy) { - bool didRemovePageGroup = m_pageGroups.remove(pageGroup); - if (didRemovePageGroup && privateBrowsingEnabled()) { - --privateBrowsingPageGroupCount; - if (!privateBrowsingPageGroupCount) - WebContext::willStopUsingPrivateBrowsing(); + ASSERT(m_pages.contains(&webPageProxy)); + m_pages.remove(&webPageProxy); + + if (privateBrowsingEnabled()) { + --privateBrowsingPageCount; + if (!privateBrowsingPageCount) + WebProcessPool::willStopUsingPrivateBrowsing(); } } void WebPreferences::update() { - for (HashSet<WebPageGroup*>::iterator it = m_pageGroups.begin(), end = m_pageGroups.end(); it != end; ++it) - (*it)->preferencesDidChange(); + for (auto& webPageProxy : m_pages) + webPageProxy->preferencesDidChange(); } void WebPreferences::updateStringValueForKey(const String& key, const String& value) @@ -101,6 +129,11 @@ void WebPreferences::updateBoolValueForKey(const String& key, bool value) update(); // FIXME: Only send over the changed key and value. } +void WebPreferences::updateBoolValueForExperimentalFeatureKey(const String& key, bool value) +{ + update(); // FIXME: Only send over the changed key and value. +} + void WebPreferences::updateUInt32ValueForKey(const String& key, uint32_t value) { platformUpdateUInt32ValueForKey(key, value); @@ -123,27 +156,27 @@ void WebPreferences::updatePrivateBrowsingValue(bool value) { platformUpdateBoolValueForKey(WebPreferencesKey::privateBrowsingEnabledKey(), value); - unsigned pageGroupsChanged = m_pageGroups.size(); - if (!pageGroupsChanged) + unsigned pagesChanged = m_pages.size(); + if (!pagesChanged) return; if (value) { - if (!privateBrowsingPageGroupCount) - WebContext::willStartUsingPrivateBrowsing(); - privateBrowsingPageGroupCount += pageGroupsChanged; + if (!privateBrowsingPageCount) + WebProcessPool::willStartUsingPrivateBrowsing(); + privateBrowsingPageCount += pagesChanged; } update(); // FIXME: Only send over the changed key and value. if (!value) { - ASSERT(privateBrowsingPageGroupCount >= pageGroupsChanged); - privateBrowsingPageGroupCount -= pageGroupsChanged; - if (!privateBrowsingPageGroupCount) - WebContext::willStopUsingPrivateBrowsing(); + ASSERT(privateBrowsingPageCount >= pagesChanged); + privateBrowsingPageCount -= pagesChanged; + if (!privateBrowsingPageCount) + WebProcessPool::willStopUsingPrivateBrowsing(); } } -#define DEFINE_PREFERENCE_GETTER_AND_SETTERS(KeyUpper, KeyLower, TypeName, Type, DefaultValue) \ +#define DEFINE_PREFERENCE_GETTER_AND_SETTERS(KeyUpper, KeyLower, TypeName, Type, DefaultValue, HumanReadableName, HumanReadableDescription) \ void WebPreferences::set##KeyUpper(const Type& value) \ { \ if (!m_store.set##TypeName##ValueForKey(WebPreferencesKey::KeyLower##Key(), value)) \ @@ -158,12 +191,138 @@ void WebPreferences::updatePrivateBrowsingValue(bool value) } \ FOR_EACH_WEBKIT_PREFERENCE(DEFINE_PREFERENCE_GETTER_AND_SETTERS) +FOR_EACH_WEBKIT_DEBUG_PREFERENCE(DEFINE_PREFERENCE_GETTER_AND_SETTERS) #undef DEFINE_PREFERENCE_GETTER_AND_SETTERS -bool WebPreferences::anyPageGroupsAreUsingPrivateBrowsing() +#define DEFINE_EXPERIMENTAL_PREFERENCE_GETTER_AND_SETTERS(KeyUpper, KeyLower, TypeName, Type, DefaultValue, HumanReadableName, HumanReadableDescription) \ + void WebPreferences::set##KeyUpper(const Type& value) \ + { \ + if (!m_store.set##TypeName##ValueForKey(WebPreferencesKey::KeyLower##Key(), value)) \ + return; \ + update##TypeName##ValueForExperimentalFeatureKey(WebPreferencesKey::KeyLower##Key(), value); \ + \ + } \ + \ + Type WebPreferences::KeyLower() const \ + { \ + return m_store.get##TypeName##ValueForKey(WebPreferencesKey::KeyLower##Key()); \ + } \ + +FOR_EACH_WEBKIT_EXPERIMENTAL_FEATURE_PREFERENCE(DEFINE_EXPERIMENTAL_PREFERENCE_GETTER_AND_SETTERS) + +#undef DEFINE_EXPERIMENTAL_PREFERENCE_GETTER_AND_SETTERS + +static Vector<RefPtr<API::Object>> createExperimentalFeaturesVector() +{ + Vector<RefPtr<API::Object>> features; + +#define ADD_EXPERIMENTAL_PREFERENCE_DESCRIPTION(KeyUpper, KeyLower, TypeName, Type, DefaultValue, HumanReadableName, HumanReadableDescription) \ + features.append(API::ExperimentalFeature::create(HumanReadableName, #KeyUpper, HumanReadableDescription, DefaultValue)); \ + + FOR_EACH_WEBKIT_EXPERIMENTAL_FEATURE_PREFERENCE(ADD_EXPERIMENTAL_PREFERENCE_DESCRIPTION) + +#undef ADD_EXPERIMENTAL_PREFERENCE_DESCRIPTION + + return features; +} + +const Vector<RefPtr<API::Object>>& WebPreferences::experimentalFeatures() +{ + static NeverDestroyed<Vector<RefPtr<API::Object>>> features = createExperimentalFeaturesVector(); + return features; +} + +bool WebPreferences::isEnabledForFeature(const API::ExperimentalFeature& feature) const +{ + struct FeatureGetterMapping { + const char* name; + bool (WebPreferences::*function) () const; + }; + +#define MAKE_FEATURE_GETTER(KeyUpper, KeyLower, TypeName, Type, DefaultValue, HumanReadableName, HumanReadableDescription) \ + { #KeyUpper, &WebPreferences::KeyLower }, \ + + static FeatureGetterMapping getters[] = { + FOR_EACH_WEBKIT_EXPERIMENTAL_FEATURE_PREFERENCE(MAKE_FEATURE_GETTER) + }; + +#undef MAKE_FEATURE_GETTER + + const String& key = feature.key(); + + for (auto& getter : getters) { + if (key == getter.name) + return (this->*getter.function)(); + } + + return false; +} + +void WebPreferences::setPeerConnectionAndMediaStreamEnabled(bool value) +{ + setPeerConnectionEnabled(value); + setMediaStreamEnabled(value); +} + +void WebPreferences::setEnabledForFeature(bool value, const API::ExperimentalFeature& feature) +{ + struct FeatureSetterMapping { + const char* name; + void (WebPreferences::*function) (const bool&); + }; + +#define MAKE_FEATURE_SETTER(KeyUpper, KeyLower, TypeName, Type, DefaultValue, HumanReadableName, HumanReadableDescription) \ + { #KeyUpper, &WebPreferences::set##KeyUpper }, \ + + static FeatureSetterMapping setters[] = { + FOR_EACH_WEBKIT_EXPERIMENTAL_FEATURE_PREFERENCE(MAKE_FEATURE_SETTER) + }; + +#undef MAKE_FEATURE_SETTER + + const String& key = feature.key(); + + for (auto& setter : setters) { + if (key == setter.name) { + if (key == WebPreferencesKey::peerConnectionEnabledKey()) + setPeerConnectionAndMediaStreamEnabled(value); + else + (this->*setter.function)(value); + return; + } + } +} + +void WebPreferences::enableAllExperimentalFeatures() +{ +#define SET_FEATURE_ENABLED(KeyUpper, KeyLower, TypeName, Type, DefaultValue, HumanReadableName, HumanReadableDescription) \ + set##KeyUpper(true); \ + + FOR_EACH_WEBKIT_EXPERIMENTAL_FEATURE_PREFERENCE(SET_FEATURE_ENABLED) + +#undef SET_FEATURE_ENABLED +} + +bool WebPreferences::anyPagesAreUsingPrivateBrowsing() +{ + return privateBrowsingPageCount; +} + +void WebPreferences::registerDefaultBoolValueForKey(const String& key, bool value) +{ + m_store.setOverrideDefaultsBoolValueForKey(key, value); + bool userValue; + if (platformGetBoolUserValueForKey(key, userValue)) + m_store.setBoolValueForKey(key, userValue); +} + +void WebPreferences::registerDefaultUInt32ValueForKey(const String& key, uint32_t value) { - return privateBrowsingPageGroupCount; + m_store.setOverrideDefaultsUInt32ValueForKey(key, value); + uint32_t userValue; + if (platformGetUInt32UserValueForKey(key, userValue)) + m_store.setUInt32ValueForKey(key, userValue); } } // namespace WebKit |