WKBundlePageOverlay.cpp [plain text]
#include "config.h"
#include "WKBundlePageOverlay.h"
#include "APIClient.h"
#include "PageOverlay.h"
#include "WKAPICast.h"
#include "WKBundleAPICast.h"
#include <WebCore/GraphicsContext.h>
namespace API {
template<> struct ClientTraits<WKBundlePageOverlayClientBase> {
typedef std::tuple<WKBundlePageOverlayClientV0> Versions;
};
template<> struct ClientTraits<WKBundlePageOverlayAccessibilityClientBase> {
typedef std::tuple<WKBundlePageOverlayAccessibilityClientV0> Versions;
};
}
using namespace WebCore;
using namespace WebKit;
class PageOverlayClientImpl : API::Client<WKBundlePageOverlayClientBase>, public PageOverlay::Client {
public:
explicit PageOverlayClientImpl(WKBundlePageOverlayClientBase* client)
{
initialize(client);
}
virtual void setAccessibilityClient(WKBundlePageOverlayAccessibilityClientBase* client)
{
m_accessibilityClient.initialize(client);
}
private:
virtual void pageOverlayDestroyed(PageOverlay*)
{
delete this;
}
virtual void willMoveToWebPage(PageOverlay* pageOverlay, WebPage* page)
{
if (!m_client.willMoveToPage)
return;
m_client.willMoveToPage(toAPI(pageOverlay), toAPI(page), m_client.base.clientInfo);
}
virtual void didMoveToWebPage(PageOverlay* pageOverlay, WebPage* page)
{
if (!m_client.didMoveToPage)
return;
m_client.didMoveToPage(toAPI(pageOverlay), toAPI(page), m_client.base.clientInfo);
}
virtual void drawRect(PageOverlay* pageOverlay, GraphicsContext& graphicsContext, const IntRect& dirtyRect)
{
if (!m_client.drawRect)
return;
m_client.drawRect(toAPI(pageOverlay), graphicsContext.platformContext(), toAPI(dirtyRect), m_client.base.clientInfo);
}
virtual bool mouseEvent(PageOverlay* pageOverlay, const WebMouseEvent& event)
{
switch (event.type()) {
case WebEvent::MouseDown: {
if (!m_client.mouseDown)
return false;
return m_client.mouseDown(toAPI(pageOverlay), toAPI(event.position()), toAPI(event.button()), m_client.base.clientInfo);
}
case WebEvent::MouseUp: {
if (!m_client.mouseUp)
return false;
return m_client.mouseUp(toAPI(pageOverlay), toAPI(event.position()), toAPI(event.button()), m_client.base.clientInfo);
}
case WebEvent::MouseMove: {
if (event.button() == WebMouseEvent::NoButton) {
if (!m_client.mouseMoved)
return false;
return m_client.mouseMoved(toAPI(pageOverlay), toAPI(event.position()), m_client.base.clientInfo);
}
if (!m_client.mouseDragged)
return false;
return m_client.mouseDragged(toAPI(pageOverlay), toAPI(event.position()), toAPI(event.button()), m_client.base.clientInfo);
}
default:
return false;
}
}
virtual WKTypeRef copyAccessibilityAttributeValue(PageOverlay* pageOverlay, WKStringRef attribute, WKTypeRef parameter)
{
if (!m_accessibilityClient.client().copyAccessibilityAttributeValue)
return 0;
return m_accessibilityClient.client().copyAccessibilityAttributeValue(toAPI(pageOverlay), attribute, parameter, m_accessibilityClient.client().base.clientInfo);
}
virtual WKArrayRef copyAccessibilityAttributeNames(PageOverlay* pageOverlay, bool paramerizedNames)
{
if (!m_accessibilityClient.client().copyAccessibilityAttributeNames)
return 0;
return m_accessibilityClient.client().copyAccessibilityAttributeNames(toAPI(pageOverlay), paramerizedNames, m_accessibilityClient.client().base.clientInfo);
}
API::Client<WKBundlePageOverlayAccessibilityClientBase> m_accessibilityClient;
};
WKTypeID WKBundlePageOverlayGetTypeID()
{
return toAPI(PageOverlay::APIType);
}
WKBundlePageOverlayRef WKBundlePageOverlayCreate(WKBundlePageOverlayClientBase* wkClient)
{
if (wkClient && wkClient->version)
return 0;
auto clientImpl = std::make_unique<PageOverlayClientImpl>(wkClient);
return toAPI(PageOverlay::create(clientImpl.release()).leakRef());
}
void WKBundlePageOverlaySetAccessibilityClient(WKBundlePageOverlayRef bundlePageOverlayRef, WKBundlePageOverlayAccessibilityClientBase* client)
{
if (client && client->version)
return;
static_cast<PageOverlayClientImpl*>(toImpl(bundlePageOverlayRef)->client())->setAccessibilityClient(client);
}
void WKBundlePageOverlaySetNeedsDisplay(WKBundlePageOverlayRef bundlePageOverlayRef, WKRect rect)
{
toImpl(bundlePageOverlayRef)->setNeedsDisplay(enclosingIntRect(toFloatRect(rect)));
}
float WKBundlePageOverlayFractionFadedIn(WKBundlePageOverlayRef)
{
return 1;
}
void WKBundlePageOverlayClear(WKBundlePageOverlayRef bundlePageOverlayRef)
{
toImpl(bundlePageOverlayRef)->clear();
}