9e4086e9c232666b2ab1daf11dd35ad6dd9f8d23
[WebKit-https.git] / Source / WebKit2 / WebProcess / WebPage / WebPageOverlay.cpp
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "WebPageOverlay.h"
28
29 #include "WebFrame.h"
30 #include "WebPage.h"
31 #include <WebCore/GraphicsLayer.h>
32 #include <WebCore/PageOverlay.h>
33 #include <wtf/NeverDestroyed.h>
34
35 using namespace WebCore;
36
37 namespace WebKit {
38
39 static HashMap<PageOverlay*, WebPageOverlay*>& overlayMap()
40 {
41     static NeverDestroyed<HashMap<PageOverlay*, WebPageOverlay*>> map;
42     return map;
43 }
44
45 PassRefPtr<WebPageOverlay> WebPageOverlay::create(std::unique_ptr<WebPageOverlay::Client> client, PageOverlay::OverlayType overlayType)
46 {
47     return adoptRef(new WebPageOverlay(WTF::move(client), overlayType));
48 }
49
50 WebPageOverlay::WebPageOverlay(std::unique_ptr<WebPageOverlay::Client> client, PageOverlay::OverlayType overlayType)
51     : m_overlay(PageOverlay::create(*this, overlayType))
52     , m_client(WTF::move(client))
53 {
54     ASSERT(m_client);
55     overlayMap().add(m_overlay.get(), this);
56 }
57
58 WebPageOverlay::~WebPageOverlay()
59 {
60     if (!m_overlay)
61         return;
62
63     overlayMap().remove(m_overlay.get());
64     m_overlay = nullptr;
65 }
66
67 WebPageOverlay* WebPageOverlay::fromCoreOverlay(PageOverlay& overlay)
68 {
69     return overlayMap().get(&overlay);
70 }
71
72 void WebPageOverlay::setNeedsDisplay(const IntRect& dirtyRect)
73 {
74     m_overlay->setNeedsDisplay(dirtyRect);
75 }
76
77 void WebPageOverlay::setNeedsDisplay()
78 {
79     m_overlay->setNeedsDisplay();
80 }
81
82 void WebPageOverlay::clear()
83 {
84     m_overlay->clear();
85 }
86
87 void WebPageOverlay::pageOverlayDestroyed(PageOverlay&)
88 {
89     if (m_overlay) {
90         overlayMap().remove(m_overlay.get());
91         m_overlay = nullptr;
92     }
93
94     m_client->pageOverlayDestroyed(*this);
95 }
96
97 void WebPageOverlay::willMoveToPage(PageOverlay&, Page* page)
98 {
99     m_client->willMoveToPage(*this, page ? WebPage::fromCorePage(page) : nullptr);
100 }
101
102 void WebPageOverlay::didMoveToPage(PageOverlay&, Page* page)
103 {
104     m_client->didMoveToPage(*this, page ? WebPage::fromCorePage(page) : nullptr);
105 }
106
107 void WebPageOverlay::drawRect(PageOverlay&, GraphicsContext& context, const IntRect& dirtyRect)
108 {
109     m_client->drawRect(*this, context, dirtyRect);
110 }
111
112 bool WebPageOverlay::mouseEvent(PageOverlay&, const PlatformMouseEvent& event)
113 {
114     return m_client->mouseEvent(*this, event);
115 }
116
117 void WebPageOverlay::didScrollFrame(PageOverlay&, Frame& frame)
118 {
119     m_client->didScrollFrame(*this, WebFrame::fromCoreFrame(frame));
120 }
121
122 #if PLATFORM(MAC)
123 DDActionContext *WebPageOverlay::actionContextForResultAtPoint(FloatPoint location, RefPtr<WebCore::Range>& rangeHandle)
124 {
125     return m_client->actionContextForResultAtPoint(*this, location, rangeHandle);
126 }
127
128 void WebPageOverlay::dataDetectorsDidPresentUI()
129 {
130     m_client->dataDetectorsDidPresentUI(*this);
131 }
132
133 void WebPageOverlay::dataDetectorsDidChangeUI()
134 {
135     m_client->dataDetectorsDidChangeUI(*this);
136 }
137
138 void WebPageOverlay::dataDetectorsDidHideUI()
139 {
140     m_client->dataDetectorsDidHideUI(*this);
141 }
142 #endif // PLATFORM(MAC)
143
144 bool WebPageOverlay::copyAccessibilityAttributeStringValueForPoint(PageOverlay&, String attribute, FloatPoint parameter, String& value)
145 {
146     return m_client->copyAccessibilityAttributeStringValueForPoint(*this, attribute, parameter, value);
147 }
148
149 bool WebPageOverlay::copyAccessibilityAttributeBoolValueForPoint(PageOverlay&, String attribute, FloatPoint parameter, bool& value)
150 {
151     return m_client->copyAccessibilityAttributeBoolValueForPoint(*this, attribute, parameter, value);
152 }
153
154 Vector<String> WebPageOverlay::copyAccessibilityAttributeNames(PageOverlay&, bool parameterizedNames)
155 {
156     return m_client->copyAccessibilityAttributeNames(*this, parameterizedNames);
157 }
158
159 } // namespace WebKit