Remove "virtual" from all lines that have both "virtual" and "override".
[WebKit-https.git] / Source / WebCore / editing / SpellingCorrectionCommand.cpp
1 /*
2  * Copyright (C) 2011, 2015 Apple 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "SpellingCorrectionCommand.h"
28
29 #include "AlternativeTextController.h"
30 #include "Document.h"
31 #include "DocumentFragment.h"
32 #include "Editor.h"
33 #include "Frame.h"
34 #include "ReplaceSelectionCommand.h"
35 #include "SetSelectionCommand.h"
36 #include "TextIterator.h"
37 #include "markup.h"
38
39 namespace WebCore {
40
41 #if USE(AUTOCORRECTION_PANEL)
42 // On Mac OS X, we use this command to keep track of user undoing a correction for the first time.
43 // This information is needed by spell checking service to update user specific data.
44 class SpellingCorrectionRecordUndoCommand : public SimpleEditCommand {
45 public:
46     static Ref<SpellingCorrectionRecordUndoCommand> create(Document& document, const String& corrected, const String& correction)
47     {
48         return adoptRef(*new SpellingCorrectionRecordUndoCommand(document, corrected, correction));
49     }
50 private:
51     SpellingCorrectionRecordUndoCommand(Document& document, const String& corrected, const String& correction)
52         : SimpleEditCommand(document)
53         , m_corrected(corrected)
54         , m_correction(correction)
55         , m_hasBeenUndone(false)
56     {
57     }
58
59     void doApply() override
60     {
61     }
62
63     void doUnapply() override
64     {
65         if (!m_hasBeenUndone) {
66             frame().editor().unappliedSpellCorrection(startingSelection(), m_corrected, m_correction);
67             m_hasBeenUndone = true;
68         }
69         
70     }
71
72 #ifndef NDEBUG
73     void getNodesInCommand(HashSet<Node*>&) override
74     {
75     }
76 #endif
77
78     String m_corrected;
79     String m_correction;
80     bool m_hasBeenUndone;
81 };
82 #endif
83
84 SpellingCorrectionCommand::SpellingCorrectionCommand(PassRefPtr<Range> rangeToBeCorrected, const String& correction)
85     : CompositeEditCommand(rangeToBeCorrected->startContainer().document())
86     , m_rangeToBeCorrected(rangeToBeCorrected)
87     , m_selectionToBeCorrected(*m_rangeToBeCorrected)
88     , m_correction(correction)
89 {
90 }
91
92 void SpellingCorrectionCommand::doApply()
93 {
94     m_corrected = plainText(m_rangeToBeCorrected.get());
95     if (!m_corrected.length())
96         return;
97
98     if (!frame().selection().shouldChangeSelection(m_selectionToBeCorrected))
99         return;
100
101     if (!m_rangeToBeCorrected)
102         return;
103
104     RefPtr<DocumentFragment> fragment = createFragmentFromText(*m_rangeToBeCorrected, m_correction);
105     if (!fragment)
106         return;
107
108     applyCommandToComposite(SetSelectionCommand::create(m_selectionToBeCorrected, FrameSelection::defaultSetSelectionOptions() | FrameSelection::SpellCorrectionTriggered));
109 #if USE(AUTOCORRECTION_PANEL)
110     applyCommandToComposite(SpellingCorrectionRecordUndoCommand::create(document(), m_corrected, m_correction));
111 #endif
112
113     applyCommandToComposite(ReplaceSelectionCommand::create(document(), fragment.release(), ReplaceSelectionCommand::MatchStyle, EditActionPaste));
114 }
115
116 bool SpellingCorrectionCommand::shouldRetainAutocorrectionIndicator() const
117 {
118     return true;
119 }
120
121 } // namespace WebCore