diff options
Diffstat (limited to 'Source/WebCore/dom/DocumentMarker.h')
-rw-r--r-- | Source/WebCore/dom/DocumentMarker.h | 180 |
1 files changed, 110 insertions, 70 deletions
diff --git a/Source/WebCore/dom/DocumentMarker.h b/Source/WebCore/dom/DocumentMarker.h index b3ac55900..904bf8c3f 100644 --- a/Source/WebCore/dom/DocumentMarker.h +++ b/Source/WebCore/dom/DocumentMarker.h @@ -1,7 +1,5 @@ /* - * This file is part of the DOM implementation for WebCore. - * - * Copyright (C) 2006 Apple Computer, Inc. + * Copyright (C) 2006-2016 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -20,12 +18,10 @@ * */ -#ifndef DocumentMarker_h -#define DocumentMarker_h +#pragma once #include <wtf/Forward.h> -#include <wtf/RefCounted.h> -#include <wtf/RefPtr.h> +#include <wtf/Variant.h> #include <wtf/text/WTFString.h> #if PLATFORM(IOS) @@ -35,8 +31,6 @@ typedef struct objc_object *id; namespace WebCore { -class DocumentMarkerDetails; - // A range of a node within a document that is "marked", such as the range of a misspelled word. // It optionally includes a description that could be displayed in the user interface. // It also optionally includes a flag specifying whether the match is active, which is ignored @@ -71,24 +65,29 @@ public: // This marker indicates that the range of text spanned by the marker is entered by voice dictation, // and it has alternative text. DictationAlternatives = 1 << 9, +#if ENABLE(TELEPHONE_NUMBER_DETECTION) + TelephoneNumber = 1 << 10, +#endif #if PLATFORM(IOS) - // FIXME: iOS has its own dictation marks. iOS should use OpenSource's. - DictationPhraseWithAlternatives = 1 << 10, - DictationResult = 1 << 11, + // FIXME: iOS should share the same dictation mark system with the other platforms <rdar://problem/9431249>. + DictationPhraseWithAlternatives = 1 << 11, + DictationResult = 1 << 12, #endif + // This marker indicates that the user has selected a text candidate. + AcceptedCandidate = 1 << 13, }; class MarkerTypes { public: - // The constructor is intentionally implicit to allow conversion from the bit-wise sum of above types + // This constructor is left implicit to allow conversion from result of a bit-wise or of enumeration values. MarkerTypes(unsigned mask) : m_mask(mask) { } bool contains(MarkerType type) const { return m_mask & type; } - bool intersects(const MarkerTypes& types) const { return (m_mask & types.m_mask); } - bool operator==(const MarkerTypes& other) const { return m_mask == other.m_mask; } + bool intersects(MarkerTypes types) const { return m_mask & types.m_mask; } + bool operator==(MarkerTypes other) const { return m_mask == other.m_mask; } - void add(const MarkerTypes& types) { m_mask |= types.m_mask; } - void remove(const MarkerTypes& types) { m_mask &= ~types.m_mask; } + void add(MarkerTypes types) { m_mask |= types.m_mask; } + void remove(MarkerTypes types) { m_mask &= ~types.m_mask; } private: unsigned m_mask; @@ -97,34 +96,62 @@ public: class AllMarkers : public MarkerTypes { public: AllMarkers() -#if !PLATFORM(IOS) - : MarkerTypes(Spelling | Grammar | TextMatch | Replacement | CorrectionIndicator | RejectedCorrection | Autocorrected | SpellCheckingExemption | DeletedAutocorrection | DictationAlternatives) -#else - : MarkerTypes(Spelling | Grammar | TextMatch | Replacement | CorrectionIndicator | RejectedCorrection | Autocorrected | SpellCheckingExemption | DeletedAutocorrection | DictationAlternatives | DictationPhraseWithAlternatives | DictationResult) -#endif // !PLATFORM(IOS) + : MarkerTypes(0 + | AcceptedCandidate + | Autocorrected + | CorrectionIndicator + | DeletedAutocorrection + | DictationAlternatives + | Grammar + | RejectedCorrection + | Replacement + | SpellCheckingExemption + | Spelling + | TextMatch +#if ENABLE(TELEPHONE_NUMBER_DETECTION) + | TelephoneNumber +#endif +#if PLATFORM(IOS) + | DictationPhraseWithAlternatives + | DictationResult +#endif + ) { } }; - DocumentMarker(); - DocumentMarker(MarkerType, unsigned startOffset, unsigned endOffset); - DocumentMarker(MarkerType, unsigned startOffset, unsigned endOffset, const String& description); + using IsActiveMatchData = bool; + using DescriptionData = String; + struct DictationData { + uint64_t context; + String originalText; + }; + struct DictationAlternativesData { +#if PLATFORM(IOS) + Vector<String> alternatives; + RetainPtr<id> metadata; +#endif + }; + using Data = Variant<IsActiveMatchData, DescriptionData, DictationData, DictationAlternativesData>; + + DocumentMarker(unsigned startOffset, unsigned endOffset, bool isActiveMatch); + DocumentMarker(MarkerType, unsigned startOffset, unsigned endOffset, const String& description = String()); + DocumentMarker(MarkerType, unsigned startOffset, unsigned endOffset, Data&&); #if PLATFORM(IOS) DocumentMarker(MarkerType, unsigned startOffset, unsigned endOffset, const String& description, const Vector<String>& alternatives, RetainPtr<id> metadata); #endif - DocumentMarker(unsigned startOffset, unsigned endOffset, bool activeMatch); - DocumentMarker(MarkerType, unsigned startOffset, unsigned endOffset, PassRefPtr<DocumentMarkerDetails>); MarkerType type() const { return m_type; } unsigned startOffset() const { return m_startOffset; } unsigned endOffset() const { return m_endOffset; } const String& description() const; - bool activeMatch() const; - DocumentMarkerDetails* details() const; + bool isActiveMatch() const; void setActiveMatch(bool); - void clearDetails() { m_details.clear(); } + + const Data& data() const { return m_data; } + void clearData() { m_data = false; } // Offset modifications are done by DocumentMarkerController. // Other classes should not call following setters. @@ -139,79 +166,92 @@ public: void setMetadata(id); #endif - bool operator==(const DocumentMarker& o) const - { - return type() == o.type() && startOffset() == o.startOffset() && endOffset() == o.endOffset(); - } - - bool operator!=(const DocumentMarker& o) const - { - return !(*this == o); - } - private: MarkerType m_type; unsigned m_startOffset; unsigned m_endOffset; -#if PLATFORM(IOS) - // FIXME: See <rdar://problem/9431249>. - Vector<String> m_alternatives; - RetainPtr<id> m_metadata; -#endif - RefPtr<DocumentMarkerDetails> m_details; + Data m_data; }; -inline DocumentMarkerDetails* DocumentMarker::details() const +inline DocumentMarker::DocumentMarker(unsigned startOffset, unsigned endOffset, bool isActiveMatch) + : m_type(TextMatch) + , m_startOffset(startOffset) + , m_endOffset(endOffset) + , m_data(isActiveMatch) +{ +} + +inline DocumentMarker::DocumentMarker(MarkerType type, unsigned startOffset, unsigned endOffset, const String& description) + : m_type(type) + , m_startOffset(startOffset) + , m_endOffset(endOffset) + , m_data(description) +{ +} + +inline DocumentMarker::DocumentMarker(MarkerType type, unsigned startOffset, unsigned endOffset, Data&& data) + : m_type(type) + , m_startOffset(startOffset) + , m_endOffset(endOffset) + , m_data(WTFMove(data)) +{ +} + +inline void DocumentMarker::shiftOffsets(int delta) +{ + m_startOffset += delta; + m_endOffset += delta; +} + +inline const String& DocumentMarker::description() const +{ + return WTF::holds_alternative<String>(m_data) ? WTF::get<String>(m_data) : emptyString(); +} + +inline bool DocumentMarker::isActiveMatch() const { - return m_details.get(); + return WTF::holds_alternative<bool>(m_data) && WTF::get<bool>(m_data); +} + +inline void DocumentMarker::setActiveMatch(bool isActiveMatch) +{ + ASSERT(m_type == TextMatch); + m_data = isActiveMatch; } #if PLATFORM(IOS) + +// FIXME: iOS should share the same dictation mark system with the other platforms <rdar://problem/9431249>. + inline DocumentMarker::DocumentMarker(MarkerType type, unsigned startOffset, unsigned endOffset, const String&, const Vector<String>& alternatives, RetainPtr<id> metadata) : m_type(type) , m_startOffset(startOffset) , m_endOffset(endOffset) - , m_alternatives(alternatives) - , m_metadata(metadata) + , m_data(DictationAlternativesData { alternatives, metadata }) { - // FIXME: <rdar://problem/11306422> iOS should investigate cleaner merge with ToT Dictation support ASSERT(type == DictationPhraseWithAlternatives || type == DictationResult); } -#endif -#if PLATFORM(IOS) inline const Vector<String>& DocumentMarker::alternatives() const { - ASSERT(m_type == DocumentMarker::DictationPhraseWithAlternatives); - return m_alternatives; + return WTF::get<DictationAlternativesData>(m_data).alternatives; } inline void DocumentMarker::setAlternative(const String& alternative, size_t index) { - ASSERT(m_type == DocumentMarker::DictationPhraseWithAlternatives); - m_alternatives[index] = alternative; + WTF::get<DictationAlternativesData>(m_data).alternatives[index] = alternative; } inline id DocumentMarker::metadata() const { - return m_metadata.get(); + return WTF::get<DictationAlternativesData>(m_data).metadata.get(); } inline void DocumentMarker::setMetadata(id metadata) { - m_metadata = metadata; + WTF::get<DictationAlternativesData>(m_data).metadata = metadata; } -#endif -class DocumentMarkerDetails : public RefCounted<DocumentMarkerDetails> -{ -public: - DocumentMarkerDetails() { } - virtual ~DocumentMarkerDetails(); - virtual bool isDescription() const { return false; } - virtual bool isTextMatch() const { return false; } -}; +#endif } // namespace WebCore - -#endif // DocumentMarker_h |