Combine ActionMenuHitTestResult with WebHitTestResult
[WebKit-https.git] / Source / WebKit2 / Shared / WebHitTestResult.cpp
1 /*
2  * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies)
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "WebHitTestResult.h"
22
23 #include "WebCoreArgumentCoders.h"
24 #include <WebCore/Document.h>
25 #include <WebCore/Frame.h>
26 #include <WebCore/FrameView.h>
27 #include <WebCore/HitTestResult.h>
28 #include <WebCore/RenderObject.h>
29 #include <WebCore/URL.h>
30 #include <WebCore/Node.h>
31 #include <wtf/text/WTFString.h>
32
33 using namespace WebCore;
34
35 namespace WebKit {
36
37 PassRefPtr<WebHitTestResult> WebHitTestResult::create(const WebHitTestResult::Data& hitTestResultData)
38 {
39     return adoptRef(new WebHitTestResult(hitTestResultData));
40 }
41
42 WebHitTestResult::Data::Data()
43 {
44 }
45
46 WebHitTestResult::Data::Data(const HitTestResult& hitTestResult)
47     : absoluteImageURL(hitTestResult.absoluteImageURL().string())
48     , absolutePDFURL(hitTestResult.absolutePDFURL().string())
49     , absoluteLinkURL(hitTestResult.absoluteLinkURL().string())
50     , absoluteMediaURL(hitTestResult.absoluteMediaURL().string())
51     , linkLabel(hitTestResult.textContent())
52     , linkTitle(hitTestResult.titleDisplayString())
53     , isContentEditable(hitTestResult.isContentEditable())
54     , elementBoundingBox(elementBoundingBoxInWindowCoordinates(hitTestResult))
55     , isScrollbar(hitTestResult.scrollbar())
56     , isSelected(hitTestResult.isSelected())
57     , isTextNode(hitTestResult.innerNode() && hitTestResult.innerNode()->isTextNode())
58     , isOverTextInsideFormControlElement(hitTestResult.isOverTextInsideFormControlElement())
59     , allowsCopy(hitTestResult.allowsCopy())
60     , isDownloadableMedia(hitTestResult.isDownloadableMedia())
61     , imageSize(0)
62 {
63 }
64
65 WebHitTestResult::Data::~Data()
66 {
67 }
68
69 void WebHitTestResult::Data::encode(IPC::ArgumentEncoder& encoder) const
70 {
71     encoder << absoluteImageURL;
72     encoder << absolutePDFURL;
73     encoder << absoluteLinkURL;
74     encoder << absoluteMediaURL;
75     encoder << linkLabel;
76     encoder << linkTitle;
77     encoder << isContentEditable;
78     encoder << elementBoundingBox;
79     encoder << isScrollbar;
80     encoder << isSelected;
81     encoder << isTextNode;
82     encoder << isOverTextInsideFormControlElement;
83     encoder << allowsCopy;
84     encoder << isDownloadableMedia;
85     encoder << hitTestLocationInViewCooordinates;
86     encoder << lookupText;
87     encoder << dictionaryPopupInfo;
88
89     SharedMemory::Handle imageHandle;
90     if (imageSharedMemory && imageSharedMemory->data())
91         imageSharedMemory->createHandle(imageHandle, SharedMemory::ReadOnly);
92     encoder << imageHandle;
93     encoder << imageSize;
94     encoder << imageExtension;
95
96     bool hasLinkTextIndicator = linkTextIndicator;
97     encoder << hasLinkTextIndicator;
98     if (hasLinkTextIndicator)
99         encoder << linkTextIndicator->data();
100
101     platformEncode(encoder);
102 }
103
104 bool WebHitTestResult::Data::decode(IPC::ArgumentDecoder& decoder, WebHitTestResult::Data& hitTestResultData)
105 {
106     if (!decoder.decode(hitTestResultData.absoluteImageURL)
107         || !decoder.decode(hitTestResultData.absolutePDFURL)
108         || !decoder.decode(hitTestResultData.absoluteLinkURL)
109         || !decoder.decode(hitTestResultData.absoluteMediaURL)
110         || !decoder.decode(hitTestResultData.linkLabel)
111         || !decoder.decode(hitTestResultData.linkTitle)
112         || !decoder.decode(hitTestResultData.isContentEditable)
113         || !decoder.decode(hitTestResultData.elementBoundingBox)
114         || !decoder.decode(hitTestResultData.isScrollbar)
115         || !decoder.decode(hitTestResultData.isSelected)
116         || !decoder.decode(hitTestResultData.isTextNode)
117         || !decoder.decode(hitTestResultData.isOverTextInsideFormControlElement)
118         || !decoder.decode(hitTestResultData.allowsCopy)
119         || !decoder.decode(hitTestResultData.isDownloadableMedia)
120         || !decoder.decode(hitTestResultData.hitTestLocationInViewCooordinates)
121         || !decoder.decode(hitTestResultData.lookupText)
122         || !decoder.decode(hitTestResultData.dictionaryPopupInfo))
123         return false;
124
125     SharedMemory::Handle imageHandle;
126     if (!decoder.decode(imageHandle))
127         return false;
128
129     if (!imageHandle.isNull())
130         hitTestResultData.imageSharedMemory = SharedMemory::create(imageHandle, SharedMemory::ReadOnly);
131
132     if (!decoder.decode(hitTestResultData.imageSize))
133         return false;
134
135     if (!decoder.decode(hitTestResultData.imageExtension))
136         return false;
137
138     bool hasLinkTextIndicator;
139     if (!decoder.decode(hasLinkTextIndicator))
140         return false;
141
142     if (hasLinkTextIndicator) {
143         WebCore::TextIndicatorData indicatorData;
144         if (!decoder.decode(indicatorData))
145             return false;
146
147         hitTestResultData.linkTextIndicator = WebCore::TextIndicator::create(indicatorData);
148     }
149
150     return platformDecode(decoder, hitTestResultData);
151 }
152
153 #if !PLATFORM(MAC)
154 void WebHitTestResult::Data::platformEncode(IPC::ArgumentEncoder& encoder) const
155 {
156 }
157
158 bool WebHitTestResult::Data::platformDecode(IPC::ArgumentDecoder& decoder, WebHitTestResult::Data& hitTestResultData)
159 {
160     return true;
161 }
162 #endif // !PLATFORM(MAC)
163
164 IntRect WebHitTestResult::Data::elementBoundingBoxInWindowCoordinates(const HitTestResult& hitTestResult)
165 {
166     Node* node = hitTestResult.innerNonSharedNode();
167     if (!node)
168         return IntRect();
169
170     Frame* frame = node->document().frame();
171     if (!frame)
172         return IntRect();
173
174     FrameView* view = frame->view();
175     if (!view)
176         return IntRect();
177
178     RenderObject* renderer = node->renderer();
179     if (!renderer)
180         return IntRect();
181
182     return view->contentsToWindow(renderer->absoluteBoundingBoxRect());
183 }
184
185 } // WebKit