diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp')
-rw-r--r-- | Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp | 145 |
1 files changed, 104 insertions, 41 deletions
diff --git a/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp b/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp index bba8626a5..bfecd33fa 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp +++ b/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePageOverlay.cpp @@ -27,15 +27,24 @@ #include "WKBundlePageOverlay.h" #include "APIClient.h" -#include "PageOverlay.h" +#include "InjectedBundleRangeHandle.h" #include "WKAPICast.h" +#include "WKArray.h" #include "WKBundleAPICast.h" +#include "WKNumber.h" +#include "WKRetainPtr.h" +#include "WKSharedAPICast.h" +#include "WKStringPrivate.h" +#include "WebPage.h" #include <WebCore/GraphicsContext.h> +#include <WebCore/PageOverlay.h> +#include <WebCore/PlatformMouseEvent.h> +#include <WebKit/WebPageOverlay.h> namespace API { template<> struct ClientTraits<WKBundlePageOverlayClientBase> { - typedef std::tuple<WKBundlePageOverlayClientV0> Versions; + typedef std::tuple<WKBundlePageOverlayClientV0, WKBundlePageOverlayClientV1> Versions; }; template<> struct ClientTraits<WKBundlePageOverlayAccessibilityClientBase> { @@ -47,7 +56,7 @@ template<> struct ClientTraits<WKBundlePageOverlayAccessibilityClientBase> { using namespace WebCore; using namespace WebKit; -class PageOverlayClientImpl : API::Client<WKBundlePageOverlayClientBase>, public PageOverlay::Client { +class PageOverlayClientImpl : API::Client<WKBundlePageOverlayClientBase>, public WebPageOverlay::Client { public: explicit PageOverlayClientImpl(WKBundlePageOverlayClientBase* client) { @@ -60,83 +69,144 @@ public: } private: - // PageOverlay::Client. - virtual void pageOverlayDestroyed(PageOverlay*) - { - delete this; - } - - virtual void willMoveToWebPage(PageOverlay* pageOverlay, WebPage* page) + // WebPageOverlay::Client. + void willMoveToPage(WebPageOverlay& pageOverlay, WebPage* page) override { if (!m_client.willMoveToPage) return; - m_client.willMoveToPage(toAPI(pageOverlay), toAPI(page), m_client.base.clientInfo); + m_client.willMoveToPage(toAPI(&pageOverlay), toAPI(page), m_client.base.clientInfo); } - virtual void didMoveToWebPage(PageOverlay* pageOverlay, WebPage* page) + void didMoveToPage(WebPageOverlay& pageOverlay, WebPage* page) override { if (!m_client.didMoveToPage) return; - m_client.didMoveToPage(toAPI(pageOverlay), toAPI(page), m_client.base.clientInfo); + m_client.didMoveToPage(toAPI(&pageOverlay), toAPI(page), m_client.base.clientInfo); } - virtual void drawRect(PageOverlay* pageOverlay, GraphicsContext& graphicsContext, const IntRect& dirtyRect) + void drawRect(WebPageOverlay& pageOverlay, GraphicsContext& graphicsContext, const IntRect& dirtyRect) override { if (!m_client.drawRect) return; - m_client.drawRect(toAPI(pageOverlay), graphicsContext.platformContext(), toAPI(dirtyRect), m_client.base.clientInfo); + m_client.drawRect(toAPI(&pageOverlay), graphicsContext.platformContext(), toAPI(dirtyRect), m_client.base.clientInfo); } - virtual bool mouseEvent(PageOverlay* pageOverlay, const WebMouseEvent& event) + bool mouseEvent(WebPageOverlay& pageOverlay, const PlatformMouseEvent& event) override { switch (event.type()) { - case WebEvent::MouseDown: { + case PlatformMouseEvent::Type::MousePressed: { if (!m_client.mouseDown) return false; - return m_client.mouseDown(toAPI(pageOverlay), toAPI(event.position()), toAPI(event.button()), m_client.base.clientInfo); + return m_client.mouseDown(toAPI(&pageOverlay), toAPI(event.position()), toAPI(event.button()), m_client.base.clientInfo); } - case WebEvent::MouseUp: { + case PlatformMouseEvent::Type::MouseReleased: { if (!m_client.mouseUp) return false; - return m_client.mouseUp(toAPI(pageOverlay), toAPI(event.position()), toAPI(event.button()), m_client.base.clientInfo); + return m_client.mouseUp(toAPI(&pageOverlay), toAPI(event.position()), toAPI(event.button()), m_client.base.clientInfo); } - case WebEvent::MouseMove: { - if (event.button() == WebMouseEvent::NoButton) { + case PlatformMouseEvent::Type::MouseMoved: { + if (event.button() == MouseButton::NoButton) { if (!m_client.mouseMoved) return false; - return m_client.mouseMoved(toAPI(pageOverlay), toAPI(event.position()), m_client.base.clientInfo); + return m_client.mouseMoved(toAPI(&pageOverlay), toAPI(event.position()), m_client.base.clientInfo); } // This is a MouseMove event with a mouse button pressed. Call mouseDragged. if (!m_client.mouseDragged) return false; - return m_client.mouseDragged(toAPI(pageOverlay), toAPI(event.position()), toAPI(event.button()), m_client.base.clientInfo); + 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 PLATFORM(MAC) + DDActionContext *actionContextForResultAtPoint(WebPageOverlay& pageOverlay, WebCore::FloatPoint location, RefPtr<WebCore::Range>& rangeHandle) override + { + if (m_client.actionContextForResultAtPoint) { + WKBundleRangeHandleRef apiRange = nullptr; + DDActionContext *actionContext = (DDActionContext *)m_client.actionContextForResultAtPoint(toAPI(&pageOverlay), WKPointMake(location.x(), location.y()), &apiRange, m_client.base.clientInfo); + + if (apiRange) + rangeHandle = toImpl(apiRange)->coreRange(); + + return actionContext; + } + + return nil; + } + + void dataDetectorsDidPresentUI(WebPageOverlay& pageOverlay) override + { + if (!m_client.dataDetectorsDidPresentUI) + return; + + m_client.dataDetectorsDidPresentUI(toAPI(&pageOverlay), m_client.base.clientInfo); + } + + void dataDetectorsDidChangeUI(WebPageOverlay& pageOverlay) override + { + if (!m_client.dataDetectorsDidChangeUI) + return; + + m_client.dataDetectorsDidChangeUI(toAPI(&pageOverlay), m_client.base.clientInfo); + } + + void dataDetectorsDidHideUI(WebPageOverlay& pageOverlay) override + { + if (!m_client.dataDetectorsDidHideUI) + return; + + m_client.dataDetectorsDidHideUI(toAPI(&pageOverlay), m_client.base.clientInfo); + } +#endif // PLATFORM(MAC) + + bool copyAccessibilityAttributeStringValueForPoint(WebPageOverlay& pageOverlay, String attribute, WebCore::FloatPoint parameter, String& value) override { if (!m_accessibilityClient.client().copyAccessibilityAttributeValue) - return 0; - return m_accessibilityClient.client().copyAccessibilityAttributeValue(toAPI(pageOverlay), attribute, parameter, m_accessibilityClient.client().base.clientInfo); + return false; + auto wkType = m_accessibilityClient.client().copyAccessibilityAttributeValue(toAPI(&pageOverlay), toCopiedAPI(attribute), WKPointCreate(WKPointMake(parameter.x(), parameter.y())), m_accessibilityClient.client().base.clientInfo); + if (toImpl(wkType)->type() != API::String::APIType) + return false; + value = toWTFString(static_cast<WKStringRef>(wkType)); + return true; } - virtual WKArrayRef copyAccessibilityAttributeNames(PageOverlay* pageOverlay, bool paramerizedNames) + bool copyAccessibilityAttributeBoolValueForPoint(WebPageOverlay& pageOverlay, String attribute, WebCore::FloatPoint parameter, bool& value) override { + if (!m_accessibilityClient.client().copyAccessibilityAttributeValue) + return false; + auto wkType = m_accessibilityClient.client().copyAccessibilityAttributeValue(toAPI(&pageOverlay), toCopiedAPI(attribute), WKPointCreate(WKPointMake(parameter.x(), parameter.y())), m_accessibilityClient.client().base.clientInfo); + if (toImpl(wkType)->type() != API::Boolean::APIType) + return false; + value = WKBooleanGetValue(static_cast<WKBooleanRef>(wkType)); + return true; + } + + Vector<String> copyAccessibilityAttributeNames(WebPageOverlay& pageOverlay, bool paramerizedNames) override + { + Vector<String> names; if (!m_accessibilityClient.client().copyAccessibilityAttributeNames) - return 0; - return m_accessibilityClient.client().copyAccessibilityAttributeNames(toAPI(pageOverlay), paramerizedNames, m_accessibilityClient.client().base.clientInfo); + return names; + auto wkNames = m_accessibilityClient.client().copyAccessibilityAttributeNames(toAPI(&pageOverlay), paramerizedNames, m_accessibilityClient.client().base.clientInfo); + + size_t count = WKArrayGetSize(wkNames); + for (size_t k = 0; k < count; k++) { + WKTypeRef item = WKArrayGetItemAtIndex(wkNames, k); + if (toImpl(item)->type() == API::String::APIType) + names.append(toWTFString(static_cast<WKStringRef>(item))); + } + + return names; } API::Client<WKBundlePageOverlayAccessibilityClientBase> m_accessibilityClient; @@ -144,25 +214,18 @@ private: WKTypeID WKBundlePageOverlayGetTypeID() { - return toAPI(PageOverlay::APIType); + return toAPI(WebPageOverlay::APIType); } WKBundlePageOverlayRef WKBundlePageOverlayCreate(WKBundlePageOverlayClientBase* wkClient) { - if (wkClient && wkClient->version) - return 0; - auto clientImpl = std::make_unique<PageOverlayClientImpl>(wkClient); - - // FIXME: Looks like this leaks the clientImpl. - return toAPI(PageOverlay::create(clientImpl.release()).leakRef()); + return toAPI(&WebPageOverlay::create(WTFMove(clientImpl)).leakRef()); } void WKBundlePageOverlaySetAccessibilityClient(WKBundlePageOverlayRef bundlePageOverlayRef, WKBundlePageOverlayAccessibilityClientBase* client) { - if (client && client->version) - return; - static_cast<PageOverlayClientImpl*>(toImpl(bundlePageOverlayRef)->client())->setAccessibilityClient(client); + static_cast<PageOverlayClientImpl&>(toImpl(bundlePageOverlayRef)->client()).setAccessibilityClient(client); } void WKBundlePageOverlaySetNeedsDisplay(WKBundlePageOverlayRef bundlePageOverlayRef, WKRect rect) |