DictationCommandIOS.cpp [plain text]
#include "config.h"
#include "DictationCommandIOS.h"
#include "Document.h"
#include "DocumentMarkerController.h"
#include "Element.h"
#include "Position.h"
#include "Range.h"
#include "SmartReplace.h"
#include "TextIterator.h"
#include "VisibleUnits.h"
namespace WebCore {
DictationCommandIOS::DictationCommandIOS(Document& document, Vector<Vector<String>>&& dictationPhrases, RetainPtr<id> metadata)
: CompositeEditCommand(document, EditActionDictation)
, m_dictationPhrases(WTFMove(dictationPhrases))
, m_metadata(WTFMove(metadata))
{
}
void DictationCommandIOS::doApply()
{
VisiblePosition insertionPosition(startingSelection().visibleStart());
unsigned resultLength = 0;
for (auto& interpretations : m_dictationPhrases) {
const String& firstInterpretation = interpretations[0];
resultLength += firstInterpretation.length();
inputText(firstInterpretation, true);
if (interpretations.size() > 1)
document().markers().addDictationPhraseWithAlternativesMarker(endingSelection().toNormalizedRange().get(), interpretations);
setEndingSelection(VisibleSelection(endingSelection().visibleEnd()));
}
VisiblePosition afterResults(endingSelection().visibleEnd());
Element* root = afterResults.rootEditableElement();
RefPtr<Range> rangeToEnd = Range::create(document(), createLegacyEditingPosition((Node *)root, 0), afterResults.deepEquivalent());
int endIndex = TextIterator::rangeLength(rangeToEnd.get(), true);
int startIndex = endIndex - resultLength;
if (startIndex >= 0) {
RefPtr<Range> resultRange = TextIterator::rangeFromLocationAndLength(document().documentElement(), startIndex, endIndex, true);
document().markers().addDictationResultMarker(resultRange.get(), m_metadata);
}
}
}