UserMessageHandlersNamespace.cpp [plain text]
#include "config.h"
#include "UserMessageHandlersNamespace.h"
#if ENABLE(USER_MESSAGE_HANDLERS)
#include "DOMWrapperWorld.h"
#include "Frame.h"
#include "Page.h"
#include "UserContentController.h"
#include "UserMessageHandler.h"
namespace WebCore {
UserMessageHandlersNamespace::UserMessageHandlersNamespace(Frame& frame, UserContentProvider& userContentProvider)
: FrameDestructionObserver(&frame)
, m_userContentProvider(userContentProvider)
{
m_userContentProvider->registerForUserMessageHandlerInvalidation(*this);
}
UserMessageHandlersNamespace::~UserMessageHandlersNamespace()
{
m_userContentProvider->unregisterForUserMessageHandlerInvalidation(*this);
}
void UserMessageHandlersNamespace::didInvalidate(UserContentProvider& provider)
{
auto oldMap = WTFMove(m_messageHandlers);
provider.forEachUserMessageHandler([&](const UserMessageHandlerDescriptor& descriptor) {
auto userMessageHandler = oldMap.take(std::make_pair(descriptor.name(), const_cast<DOMWrapperWorld*>(&descriptor.world())));
if (userMessageHandler) {
m_messageHandlers.add(std::make_pair(descriptor.name(), const_cast<DOMWrapperWorld*>(&descriptor.world())), userMessageHandler);
return;
}
});
for (auto& userMessageHandler : oldMap.values())
userMessageHandler->invalidateDescriptor();
}
Vector<AtomicString> UserMessageHandlersNamespace::supportedPropertyNames() const
{
return { };
}
UserMessageHandler* UserMessageHandlersNamespace::namedItem(DOMWrapperWorld& world, const AtomicString& name)
{
Frame* frame = this->frame();
if (!frame)
return nullptr;
Page* page = frame->page();
if (!page)
return nullptr;
UserMessageHandler* handler = m_messageHandlers.get(std::pair<AtomicString, RefPtr<DOMWrapperWorld>>(name, &world));
if (handler)
return handler;
page->userContentProvider().forEachUserMessageHandler([&](const UserMessageHandlerDescriptor& descriptor) {
if (descriptor.name() != name || &descriptor.world() != &world)
return;
ASSERT(!handler);
auto addResult = m_messageHandlers.add(std::make_pair(descriptor.name(), const_cast<DOMWrapperWorld*>(&descriptor.world())), UserMessageHandler::create(*frame, const_cast<UserMessageHandlerDescriptor&>(descriptor)));
handler = addResult.iterator->value.get();
});
return handler;
}
}
#endif // ENABLE(USER_MESSAGE_HANDLERS)