1 /* 2 * Copyright (C) 2011 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 are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "core/dom/DocumentMarker.h" 33 34 namespace WebCore { 35 36 DocumentMarkerDetails::~DocumentMarkerDetails() 37 { 38 } 39 40 class DocumentMarkerDescription FINAL : public DocumentMarkerDetails { 41 public: 42 static PassRefPtr<DocumentMarkerDescription> create(const String&); 43 44 const String& description() const { return m_description; } 45 virtual bool isDescription() const OVERRIDE { return true; } 46 47 private: 48 DocumentMarkerDescription(const String& description) 49 : m_description(description) 50 { 51 } 52 53 String m_description; 54 }; 55 56 PassRefPtr<DocumentMarkerDescription> DocumentMarkerDescription::create(const String& description) 57 { 58 return adoptRef(new DocumentMarkerDescription(description)); 59 } 60 61 inline DocumentMarkerDescription* toDocumentMarkerDescription(DocumentMarkerDetails* details) 62 { 63 if (details && details->isDescription()) 64 return static_cast<DocumentMarkerDescription*>(details); 65 return 0; 66 } 67 68 69 class DocumentMarkerTextMatch FINAL : public DocumentMarkerDetails { 70 public: 71 static PassRefPtr<DocumentMarkerTextMatch> instanceFor(bool); 72 73 bool activeMatch() const { return m_match; } 74 virtual bool isTextMatch() const OVERRIDE { return true; } 75 76 private: 77 explicit DocumentMarkerTextMatch(bool match) 78 : m_match(match) 79 { 80 } 81 82 bool m_match; 83 }; 84 85 PassRefPtr<DocumentMarkerTextMatch> DocumentMarkerTextMatch::instanceFor(bool match) 86 { 87 DEFINE_STATIC_REF(DocumentMarkerTextMatch, trueInstance, (adoptRef(new DocumentMarkerTextMatch(true)))); 88 DEFINE_STATIC_REF(DocumentMarkerTextMatch, falseInstance, (adoptRef(new DocumentMarkerTextMatch(false)))); 89 return match ? trueInstance : falseInstance; 90 } 91 92 inline DocumentMarkerTextMatch* toDocumentMarkerTextMatch(DocumentMarkerDetails* details) 93 { 94 if (details && details->isTextMatch()) 95 return static_cast<DocumentMarkerTextMatch*>(details); 96 return 0; 97 } 98 99 100 DocumentMarker::DocumentMarker() 101 : m_type(Spelling) 102 , m_startOffset(0) 103 , m_endOffset(0) 104 , m_hash(0) 105 { 106 } 107 108 DocumentMarker::DocumentMarker(MarkerType type, unsigned startOffset, unsigned endOffset) 109 : m_type(type) 110 , m_startOffset(startOffset) 111 , m_endOffset(endOffset) 112 , m_hash(0) 113 { 114 } 115 116 DocumentMarker::DocumentMarker(MarkerType type, unsigned startOffset, unsigned endOffset, const String& description) 117 : m_type(type) 118 , m_startOffset(startOffset) 119 , m_endOffset(endOffset) 120 , m_details(description.isEmpty() ? nullptr : DocumentMarkerDescription::create(description)) 121 , m_hash(0) 122 { 123 } 124 125 DocumentMarker::DocumentMarker(MarkerType type, unsigned startOffset, unsigned endOffset, const String& description, uint32_t hash) 126 : m_type(type) 127 , m_startOffset(startOffset) 128 , m_endOffset(endOffset) 129 , m_details(description.isEmpty() ? nullptr : DocumentMarkerDescription::create(description)) 130 , m_hash(hash) 131 { 132 } 133 134 DocumentMarker::DocumentMarker(unsigned startOffset, unsigned endOffset, bool activeMatch) 135 : m_type(DocumentMarker::TextMatch) 136 , m_startOffset(startOffset) 137 , m_endOffset(endOffset) 138 , m_details(DocumentMarkerTextMatch::instanceFor(activeMatch)) 139 , m_hash(0) 140 { 141 } 142 143 DocumentMarker::DocumentMarker(MarkerType type, unsigned startOffset, unsigned endOffset, PassRefPtr<DocumentMarkerDetails> details) 144 : m_type(type) 145 , m_startOffset(startOffset) 146 , m_endOffset(endOffset) 147 , m_details(details) 148 , m_hash(0) 149 { 150 } 151 152 void DocumentMarker::shiftOffsets(int delta) 153 { 154 m_startOffset += delta; 155 m_endOffset += delta; 156 } 157 158 void DocumentMarker::setActiveMatch(bool active) 159 { 160 m_details = DocumentMarkerTextMatch::instanceFor(active); 161 } 162 163 const String& DocumentMarker::description() const 164 { 165 if (DocumentMarkerDescription* details = toDocumentMarkerDescription(m_details.get())) 166 return details->description(); 167 return emptyString(); 168 } 169 170 bool DocumentMarker::activeMatch() const 171 { 172 if (DocumentMarkerTextMatch* details = toDocumentMarkerTextMatch(m_details.get())) 173 return details->activeMatch(); 174 return false; 175 } 176 177 } // namespace WebCore 178