1 /* 2 * Copyright (C) 2012 Google 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 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 17 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 20 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 21 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "public/web/WebHitTestResult.h" 28 29 #include "core/dom/Element.h" 30 #include "core/dom/Node.h" 31 #include "core/editing/VisiblePosition.h" 32 #include "core/rendering/HitTestResult.h" 33 #include "core/rendering/RenderObject.h" 34 #include "platform/weborigin/KURL.h" 35 #include "public/platform/WebPoint.h" 36 #include "public/platform/WebURL.h" 37 #include "public/web/WebElement.h" 38 #include "public/web/WebNode.h" 39 40 namespace blink { 41 42 class WebHitTestResultPrivate : public RefCountedWillBeGarbageCollectedFinalized<WebHitTestResultPrivate> { 43 public: 44 static PassRefPtrWillBeRawPtr<WebHitTestResultPrivate> create(const HitTestResult&); 45 static PassRefPtrWillBeRawPtr<WebHitTestResultPrivate> create(const WebHitTestResultPrivate&); 46 void trace(Visitor* visitor) { visitor->trace(m_result); } 47 const HitTestResult& result() const { return m_result; } 48 49 private: 50 WebHitTestResultPrivate(const HitTestResult&); 51 WebHitTestResultPrivate(const WebHitTestResultPrivate&); 52 53 HitTestResult m_result; 54 }; 55 56 inline WebHitTestResultPrivate::WebHitTestResultPrivate(const HitTestResult& result) 57 : m_result(result) 58 { 59 } 60 61 inline WebHitTestResultPrivate::WebHitTestResultPrivate(const WebHitTestResultPrivate& result) 62 : m_result(result.m_result) 63 { 64 } 65 66 PassRefPtrWillBeRawPtr<WebHitTestResultPrivate> WebHitTestResultPrivate::create(const HitTestResult& result) 67 { 68 return adoptRefWillBeNoop(new WebHitTestResultPrivate(result)); 69 } 70 71 PassRefPtrWillBeRawPtr<WebHitTestResultPrivate> WebHitTestResultPrivate::create(const WebHitTestResultPrivate& result) 72 { 73 return adoptRefWillBeNoop(new WebHitTestResultPrivate(result)); 74 } 75 76 WebNode WebHitTestResult::node() const 77 { 78 return WebNode(m_private->result().innerNode()); 79 } 80 81 WebPoint WebHitTestResult::localPoint() const 82 { 83 return roundedIntPoint(m_private->result().localPoint()); 84 } 85 86 WebElement WebHitTestResult::urlElement() const 87 { 88 return WebElement(m_private->result().URLElement()); 89 } 90 91 WebURL WebHitTestResult::absoluteImageURL() const 92 { 93 return m_private->result().absoluteImageURL(); 94 } 95 96 WebURL WebHitTestResult::absoluteLinkURL() const 97 { 98 return m_private->result().absoluteLinkURL(); 99 } 100 101 bool WebHitTestResult::isContentEditable() const 102 { 103 return m_private->result().isContentEditable(); 104 } 105 106 WebHitTestResult::WebHitTestResult(const HitTestResult& result) 107 : m_private(WebHitTestResultPrivate::create(result)) 108 { 109 } 110 111 WebHitTestResult& WebHitTestResult::operator=(const HitTestResult& result) 112 { 113 m_private = WebHitTestResultPrivate::create(result); 114 return *this; 115 } 116 117 bool WebHitTestResult::isNull() const 118 { 119 return !m_private.get(); 120 } 121 122 void WebHitTestResult::assign(const WebHitTestResult& info) 123 { 124 if (info.isNull()) 125 m_private.reset(); 126 else 127 m_private = WebHitTestResultPrivate::create(*info.m_private.get()); 128 } 129 130 void WebHitTestResult::reset() 131 { 132 m_private.reset(); 133 } 134 135 } // namespace blink 136