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 34namespace WebCore { 35 36DocumentMarkerDetails::~DocumentMarkerDetails() 37{ 38} 39 40class DocumentMarkerDescription : public DocumentMarkerDetails { 41public: 42 static PassRefPtr<DocumentMarkerDescription> create(const String&); 43 44 const String& description() const { return m_description; } 45 virtual bool isDescription() const { return true; } 46 47private: 48 DocumentMarkerDescription(const String& description) 49 : m_description(description) 50 { 51 } 52 53 String m_description; 54}; 55 56PassRefPtr<DocumentMarkerDescription> DocumentMarkerDescription::create(const String& description) 57{ 58 return adoptRef(new DocumentMarkerDescription(description)); 59} 60 61inline DocumentMarkerDescription* toDocumentMarkerDescription(DocumentMarkerDetails* details) 62{ 63 if (details && details->isDescription()) 64 return static_cast<DocumentMarkerDescription*>(details); 65 return 0; 66} 67 68 69class DocumentMarkerTextMatch : public DocumentMarkerDetails { 70public: 71 static PassRefPtr<DocumentMarkerTextMatch> instanceFor(bool); 72 73 bool activeMatch() const { return m_match; } 74 virtual bool isTextMatch() const { return true; } 75 76private: 77 explicit DocumentMarkerTextMatch(bool match) 78 : m_match(match) 79 { 80 } 81 82 bool m_match; 83}; 84 85PassRefPtr<DocumentMarkerTextMatch> DocumentMarkerTextMatch::instanceFor(bool match) 86{ 87 DEFINE_STATIC_LOCAL(RefPtr<DocumentMarkerTextMatch>, trueInstance, (adoptRef(new DocumentMarkerTextMatch(true)))); 88 DEFINE_STATIC_LOCAL(RefPtr<DocumentMarkerTextMatch>, falseInstance, (adoptRef(new DocumentMarkerTextMatch(false)))); 89 return match ? trueInstance : falseInstance; 90} 91 92inline DocumentMarkerTextMatch* toDocumentMarkerTextMatch(DocumentMarkerDetails* details) 93{ 94 if (details && details->isTextMatch()) 95 return static_cast<DocumentMarkerTextMatch*>(details); 96 return 0; 97} 98 99 100DocumentMarker::DocumentMarker() 101 : m_type(Spelling) 102 , m_startOffset(0) 103 , m_endOffset(0) 104 , m_hash(0) 105{ 106} 107 108DocumentMarker::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 116DocumentMarker::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() ? 0 : DocumentMarkerDescription::create(description)) 121 , m_hash(0) 122{ 123} 124 125DocumentMarker::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() ? 0 : DocumentMarkerDescription::create(description)) 130 , m_hash(hash) 131{ 132} 133 134DocumentMarker::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 143DocumentMarker::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 152void DocumentMarker::shiftOffsets(int delta) 153{ 154 m_startOffset += delta; 155 m_endOffset += delta; 156} 157 158void DocumentMarker::setActiveMatch(bool active) 159{ 160 m_details = DocumentMarkerTextMatch::instanceFor(active); 161} 162 163const String& DocumentMarker::description() const 164{ 165 if (DocumentMarkerDescription* details = toDocumentMarkerDescription(m_details.get())) 166 return details->description(); 167 return emptyString(); 168} 169 170bool 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