WebCompiledContentRuleListData.cpp [plain text]
#include "config.h"
#include "WebCompiledContentRuleListData.h"
#if ENABLE(CONTENT_EXTENSIONS)
#include "ArgumentCoders.h"
#include "SharedBufferDataReference.h"
namespace WebKit {
size_t WebCompiledContentRuleListData::size() const
{
return WTF::switchOn(data, [] (const auto& sharedMemoryOrBuffer) {
return sharedMemoryOrBuffer->size();
});
}
const void* WebCompiledContentRuleListData::dataPointer() const
{
return WTF::switchOn(data, [] (const auto& sharedMemoryOrBuffer) -> const void* {
return sharedMemoryOrBuffer->data();
});
}
void WebCompiledContentRuleListData::encode(IPC::Encoder& encoder) const
{
if (auto sharedMemory = WTF::get_if<RefPtr<SharedMemory>>(data)) {
encoder << true;
SharedMemory::Handle handle;
sharedMemory->get()->createHandle(handle, SharedMemory::Protection::ReadOnly);
encoder << handle;
} else {
encoder << false;
encoder << IPC::SharedBufferDataReference { *WTF::get<RefPtr<WebCore::SharedBuffer>>(data) };
}
encoder << conditionsApplyOnlyToDomainOffset;
encoder << actionsOffset;
encoder << actionsSize;
encoder << filtersWithoutConditionsBytecodeOffset;
encoder << filtersWithoutConditionsBytecodeSize;
encoder << filtersWithConditionsBytecodeOffset;
encoder << filtersWithConditionsBytecodeSize;
encoder << topURLFiltersBytecodeOffset;
encoder << topURLFiltersBytecodeSize;
}
Optional<WebCompiledContentRuleListData> WebCompiledContentRuleListData::decode(IPC::Decoder& decoder)
{
WebCompiledContentRuleListData compiledContentRuleListData;
Optional<bool> hasSharedMemory;
decoder >> hasSharedMemory;
if (!hasSharedMemory)
return WTF::nullopt;
if (*hasSharedMemory) {
SharedMemory::Handle handle;
if (!decoder.decode(handle))
return WTF::nullopt;
compiledContentRuleListData.data = { SharedMemory::map(handle, SharedMemory::Protection::ReadOnly) };
} else {
IPC::DataReference dataReference;
if (!decoder.decode(dataReference))
return WTF::nullopt;
compiledContentRuleListData.data = { RefPtr<WebCore::SharedBuffer>(WebCore::SharedBuffer::create(dataReference.data(), dataReference.size())) };
}
if (!decoder.decode(compiledContentRuleListData.conditionsApplyOnlyToDomainOffset))
return WTF::nullopt;
if (!decoder.decode(compiledContentRuleListData.actionsOffset))
return WTF::nullopt;
if (!decoder.decode(compiledContentRuleListData.actionsSize))
return WTF::nullopt;
if (!decoder.decode(compiledContentRuleListData.filtersWithoutConditionsBytecodeOffset))
return WTF::nullopt;
if (!decoder.decode(compiledContentRuleListData.filtersWithoutConditionsBytecodeSize))
return WTF::nullopt;
if (!decoder.decode(compiledContentRuleListData.filtersWithConditionsBytecodeOffset))
return WTF::nullopt;
if (!decoder.decode(compiledContentRuleListData.filtersWithConditionsBytecodeSize))
return WTF::nullopt;
if (!decoder.decode(compiledContentRuleListData.topURLFiltersBytecodeOffset))
return WTF::nullopt;
if (!decoder.decode(compiledContentRuleListData.topURLFiltersBytecodeSize))
return WTF::nullopt;
return WTFMove(compiledContentRuleListData);
}
}
#endif // ENABLE(CONTENT_EXTENSIONS)