/* * Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "config.h" #include "WebHitTestResultData.h" #include "WebCoreArgumentCoders.h" #include #include #include #include #include #include #include #include using namespace WebCore; namespace WebKit { WebHitTestResultData::WebHitTestResultData() { } WebHitTestResultData::WebHitTestResultData(const WebCore::HitTestResult& hitTestResult) : absoluteImageURL(hitTestResult.absoluteImageURL().string()) , absolutePDFURL(hitTestResult.absolutePDFURL().string()) , absoluteLinkURL(hitTestResult.absoluteLinkURL().string()) , absoluteMediaURL(hitTestResult.absoluteMediaURL().string()) , linkLabel(hitTestResult.textContent()) , linkTitle(hitTestResult.titleDisplayString()) , isContentEditable(hitTestResult.isContentEditable()) , elementBoundingBox(elementBoundingBoxInWindowCoordinates(hitTestResult)) , isScrollbar(hitTestResult.scrollbar()) , isSelected(hitTestResult.isSelected()) , isTextNode(hitTestResult.innerNode() && hitTestResult.innerNode()->isTextNode()) , isOverTextInsideFormControlElement(hitTestResult.isOverTextInsideFormControlElement()) , allowsCopy(hitTestResult.allowsCopy()) , isDownloadableMedia(hitTestResult.isDownloadableMedia()) , imageSize(0) { } WebHitTestResultData::WebHitTestResultData(const WebCore::HitTestResult& hitTestResult, bool includeImage) : absoluteImageURL(hitTestResult.absoluteImageURL().string()) , absolutePDFURL(hitTestResult.absolutePDFURL().string()) , absoluteLinkURL(hitTestResult.absoluteLinkURL().string()) , absoluteMediaURL(hitTestResult.absoluteMediaURL().string()) , linkLabel(hitTestResult.textContent()) , linkTitle(hitTestResult.titleDisplayString()) , isContentEditable(hitTestResult.isContentEditable()) , elementBoundingBox(elementBoundingBoxInWindowCoordinates(hitTestResult)) , isScrollbar(hitTestResult.scrollbar()) , isSelected(hitTestResult.isSelected()) , isTextNode(hitTestResult.innerNode() && hitTestResult.innerNode()->isTextNode()) , isOverTextInsideFormControlElement(hitTestResult.isOverTextInsideFormControlElement()) , allowsCopy(hitTestResult.allowsCopy()) , isDownloadableMedia(hitTestResult.isDownloadableMedia()) , imageSize(0) { if (!includeImage) return; if (Image* image = hitTestResult.image()) { RefPtr buffer = image->data(); if (buffer) { imageSharedMemory = WebKit::SharedMemory::allocate(buffer->size()); memcpy(imageSharedMemory->data(), buffer->data(), buffer->size()); imageSize = buffer->size(); } } } WebHitTestResultData::~WebHitTestResultData() { } void WebHitTestResultData::encode(IPC::ArgumentEncoder& encoder) const { encoder << absoluteImageURL; encoder << absolutePDFURL; encoder << absoluteLinkURL; encoder << absoluteMediaURL; encoder << linkLabel; encoder << linkTitle; encoder << isContentEditable; encoder << elementBoundingBox; encoder << isScrollbar; encoder << isSelected; encoder << isTextNode; encoder << isOverTextInsideFormControlElement; encoder << allowsCopy; encoder << isDownloadableMedia; encoder << lookupText; encoder << dictionaryPopupInfo; WebKit::SharedMemory::Handle imageHandle; if (imageSharedMemory && imageSharedMemory->data()) imageSharedMemory->createHandle(imageHandle, WebKit::SharedMemory::Protection::ReadOnly); encoder << imageHandle; encoder << imageSize; bool hasLinkTextIndicator = linkTextIndicator; encoder << hasLinkTextIndicator; if (hasLinkTextIndicator) encoder << linkTextIndicator->data(); platformEncode(encoder); } bool WebHitTestResultData::decode(IPC::ArgumentDecoder& decoder, WebHitTestResultData& hitTestResultData) { if (!decoder.decode(hitTestResultData.absoluteImageURL) || !decoder.decode(hitTestResultData.absolutePDFURL) || !decoder.decode(hitTestResultData.absoluteLinkURL) || !decoder.decode(hitTestResultData.absoluteMediaURL) || !decoder.decode(hitTestResultData.linkLabel) || !decoder.decode(hitTestResultData.linkTitle) || !decoder.decode(hitTestResultData.isContentEditable) || !decoder.decode(hitTestResultData.elementBoundingBox) || !decoder.decode(hitTestResultData.isScrollbar) || !decoder.decode(hitTestResultData.isSelected) || !decoder.decode(hitTestResultData.isTextNode) || !decoder.decode(hitTestResultData.isOverTextInsideFormControlElement) || !decoder.decode(hitTestResultData.allowsCopy) || !decoder.decode(hitTestResultData.isDownloadableMedia) || !decoder.decode(hitTestResultData.lookupText) || !decoder.decode(hitTestResultData.dictionaryPopupInfo)) return false; WebKit::SharedMemory::Handle imageHandle; if (!decoder.decode(imageHandle)) return false; if (!imageHandle.isNull()) hitTestResultData.imageSharedMemory = WebKit::SharedMemory::map(imageHandle, WebKit::SharedMemory::Protection::ReadOnly); if (!decoder.decode(hitTestResultData.imageSize)) return false; bool hasLinkTextIndicator; if (!decoder.decode(hasLinkTextIndicator)) return false; if (hasLinkTextIndicator) { WebCore::TextIndicatorData indicatorData; if (!decoder.decode(indicatorData)) return false; hitTestResultData.linkTextIndicator = WebCore::TextIndicator::create(indicatorData); } return platformDecode(decoder, hitTestResultData); } #if !PLATFORM(MAC) void WebHitTestResultData::platformEncode(IPC::ArgumentEncoder& encoder) const { } bool WebHitTestResultData::platformDecode(IPC::ArgumentDecoder& decoder, WebHitTestResultData& hitTestResultData) { return true; } #endif // !PLATFORM(MAC) IntRect WebHitTestResultData::elementBoundingBoxInWindowCoordinates(const WebCore::HitTestResult& hitTestResult) { Node* node = hitTestResult.innerNonSharedNode(); if (!node) return IntRect(); Frame* frame = node->document().frame(); if (!frame) return IntRect(); FrameView* view = frame->view(); if (!view) return IntRect(); RenderObject* renderer = node->renderer(); if (!renderer) return IntRect(); return view->contentsToWindow(renderer->absoluteBoundingBoxRect()); } } // WebKit