NetworkContentRuleListManager.cpp [plain text]
#include "config.h"
#include "NetworkContentRuleListManager.h"
#if ENABLE(CONTENT_EXTENSIONS)
#include "NetworkProcess.h"
#include "NetworkProcessProxyMessages.h"
#include "WebCompiledContentRuleList.h"
namespace WebKit {
using namespace WebCore;
NetworkContentRuleListManager::NetworkContentRuleListManager() = default;
NetworkContentRuleListManager::~NetworkContentRuleListManager()
{
auto pendingCallbacks = WTFMove(m_pendingCallbacks);
if (pendingCallbacks.isEmpty())
return;
WebCore::ContentExtensions::ContentExtensionsBackend backend;
for (auto& callbacks : pendingCallbacks.values()) {
for (auto& callback : callbacks)
callback(backend);
}
}
void NetworkContentRuleListManager::contentExtensionsBackend(UserContentControllerIdentifier identifier, BackendCallback&& callback)
{
auto iterator = m_contentExtensionBackends.find(identifier);
if (iterator != m_contentExtensionBackends.end()) {
callback(*iterator->value);
return;
}
m_pendingCallbacks.ensure(identifier, [] {
return Vector<BackendCallback> { };
}).iterator->value.append(WTFMove(callback));
NetworkProcess::singleton().parentProcessConnection()->send(Messages::NetworkProcessProxy::ContentExtensionRules { identifier }, 0);
}
void NetworkContentRuleListManager::addContentRuleLists(UserContentControllerIdentifier identifier, Vector<std::pair<String, WebCompiledContentRuleListData>>&& contentRuleLists)
{
auto& backend = *m_contentExtensionBackends.ensure(identifier, [] {
return std::make_unique<WebCore::ContentExtensions::ContentExtensionsBackend>();
}).iterator->value;
for (auto&& contentRuleList : contentRuleLists) {
auto compiledContentRuleList = WebCompiledContentRuleList::create(WTFMove(contentRuleList.second));
backend.addContentExtension(contentRuleList.first, WTFMove(compiledContentRuleList), ContentExtensions::ContentExtension::ShouldCompileCSS::No);
}
auto pendingCallbacks = m_pendingCallbacks.take(identifier);
for (auto& callback : pendingCallbacks)
callback(backend);
}
void NetworkContentRuleListManager::removeContentRuleList(UserContentControllerIdentifier identifier, const String& name)
{
auto iterator = m_contentExtensionBackends.find(identifier);
if (iterator == m_contentExtensionBackends.end())
return;
iterator->value->removeContentExtension(name);
}
void NetworkContentRuleListManager::removeAllContentRuleLists(UserContentControllerIdentifier identifier)
{
auto iterator = m_contentExtensionBackends.find(identifier);
if (iterator == m_contentExtensionBackends.end())
return;
iterator->value->removeAllContentExtensions();
}
void NetworkContentRuleListManager::remove(UserContentControllerIdentifier identifier)
{
m_contentExtensionBackends.remove(identifier);
}
}
#endif // ENABLE(CONTENT_EXTENSIONS)