Index: Source/core/editing/SpellChecker.cpp |
diff --git a/Source/core/editing/SpellChecker.cpp b/Source/core/editing/SpellChecker.cpp |
index 9f3e8ddf11666e84a6227d13fce09400cd0ac87f..7bf2259219b734d486899eaeea042d4df9c5776a 100644 |
--- a/Source/core/editing/SpellChecker.cpp |
+++ b/Source/core/editing/SpellChecker.cpp |
@@ -71,9 +71,9 @@ bool isSelectionInTextFormControl(const VisibleSelection& selection) |
} // namespace |
-PassOwnPtr<SpellChecker> SpellChecker::create(LocalFrame& frame) |
+PassOwnPtrWillBeRawPtr<SpellChecker> SpellChecker::create(LocalFrame& frame) |
{ |
- return adoptPtr(new SpellChecker(frame)); |
+ return adoptPtrWillBeNoop(new SpellChecker(frame)); |
} |
static SpellCheckerClient& emptySpellCheckerClient() |
@@ -84,7 +84,7 @@ static SpellCheckerClient& emptySpellCheckerClient() |
SpellCheckerClient& SpellChecker::spellCheckerClient() const |
{ |
- if (Page* page = m_frame.page()) |
+ if (Page* page = frame().page()) |
return page->spellCheckerClient(); |
return emptySpellCheckerClient(); |
} |
@@ -95,8 +95,8 @@ TextCheckerClient& SpellChecker::textChecker() const |
} |
SpellChecker::SpellChecker(LocalFrame& frame) |
- : m_frame(frame) |
- , m_spellCheckRequester(adoptPtr(new SpellCheckRequester(frame))) |
+ : m_frame(&frame) |
+ , m_spellCheckRequester(SpellCheckRequester::create(frame)) |
{ |
} |
@@ -114,7 +114,7 @@ void SpellChecker::toggleContinuousSpellChecking() |
spellCheckerClient().toggleContinuousSpellChecking(); |
if (isContinuousSpellCheckingEnabled()) |
return; |
- for (Frame* frame = m_frame.page()->mainFrame(); frame; frame = frame->tree().traverseNext()) { |
+ for (Frame* frame = this->frame().page()->mainFrame(); frame; frame = frame->tree().traverseNext()) { |
if (!frame->isLocalFrame()) |
continue; |
for (Node* node = &toLocalFrame(frame)->document()->rootNode(); node; node = NodeTraversal::next(*node)) { |
@@ -156,8 +156,8 @@ void SpellChecker::didBeginEditing(Element* element) |
void SpellChecker::ignoreSpelling() |
{ |
- if (RefPtrWillBeRawPtr<Range> selectedRange = m_frame.selection().toNormalizedRange()) |
- m_frame.document()->markers().removeMarkers(selectedRange.get(), DocumentMarker::Spelling); |
+ if (RefPtrWillBeRawPtr<Range> selectedRange = frame().selection().toNormalizedRange()) |
+ frame().document()->markers().removeMarkers(selectedRange.get(), DocumentMarker::Spelling); |
} |
void SpellChecker::advanceToNextMisspelling(bool startBeforeSelection) |
@@ -167,9 +167,9 @@ void SpellChecker::advanceToNextMisspelling(bool startBeforeSelection) |
// Start at the end of the selection, search to edge of document. Starting at the selection end makes |
// repeated "check spelling" commands work. |
- VisibleSelection selection(m_frame.selection().selection()); |
+ VisibleSelection selection(frame().selection().selection()); |
Position spellingSearchStart, spellingSearchEnd; |
- Range::selectNodeContents(m_frame.document(), spellingSearchStart, spellingSearchEnd); |
+ Range::selectNodeContents(frame().document(), spellingSearchStart, spellingSearchEnd); |
bool startedWithSelection = false; |
if (selection.start().deprecatedNode()) { |
@@ -192,7 +192,7 @@ void SpellChecker::advanceToNextMisspelling(bool startBeforeSelection) |
// when spell checking the whole document before sending the message. |
// In that case the document might not be editable, but there are editable pockets that need to be spell checked. |
- position = firstEditableVisiblePositionAfterPositionInRoot(position, m_frame.document()->documentElement()).deepEquivalent(); |
+ position = firstEditableVisiblePositionAfterPositionInRoot(position, frame().document()->documentElement()).deepEquivalent(); |
if (position.isNull()) |
return; |
@@ -306,10 +306,10 @@ void SpellChecker::advanceToNextMisspelling(bool startBeforeSelection) |
Position badGrammarStart = grammarSearchStart; |
Position badGrammarEnd = grammarSearchEnd; |
TextIterator::subrange(badGrammarStart, badGrammarEnd, grammarPhraseOffset + grammarDetail.location, grammarDetail.length); |
- m_frame.selection().setSelection(VisibleSelection(badGrammarStart, badGrammarEnd)); |
- m_frame.selection().revealSelection(); |
+ frame().selection().setSelection(VisibleSelection(badGrammarStart, badGrammarEnd)); |
+ frame().selection().revealSelection(); |
- m_frame.document()->markers().addMarker(badGrammarStart, badGrammarEnd, DocumentMarker::Grammar, grammarDetail.userDescription); |
+ frame().document()->markers().addMarker(badGrammarStart, badGrammarEnd, DocumentMarker::Grammar, grammarDetail.userDescription); |
} else if (!misspelledWord.isEmpty()) { |
// We found a misspelling, but not any earlier bad grammar. Select the misspelling, update the spelling panel, and store |
// a marker so we draw the red squiggle later. |
@@ -317,11 +317,11 @@ void SpellChecker::advanceToNextMisspelling(bool startBeforeSelection) |
Position misspellingStart = spellingSearchStart; |
Position misspellingEnd = spellingSearchEnd; |
TextIterator::subrange(misspellingStart, misspellingEnd, misspellingOffset, misspelledWord.length()); |
- m_frame.selection().setSelection(VisibleSelection(misspellingStart, misspellingEnd, DOWNSTREAM)); |
- m_frame.selection().revealSelection(); |
+ frame().selection().setSelection(VisibleSelection(misspellingStart, misspellingEnd, DOWNSTREAM)); |
+ frame().selection().revealSelection(); |
spellCheckerClient().updateSpellingUIWithMisspelledWord(misspelledWord); |
- m_frame.document()->markers().addMarker(misspellingStart, misspellingEnd, DocumentMarker::Spelling); |
+ frame().document()->markers().addMarker(misspellingStart, misspellingEnd, DocumentMarker::Spelling); |
} |
} |
@@ -340,7 +340,7 @@ void SpellChecker::clearMisspellingsAndBadGrammar(const VisibleSelection &moving |
{ |
RefPtrWillBeRawPtr<Range> selectedRange = movingSelection.toNormalizedRange(); |
if (selectedRange) |
- m_frame.document()->markers().removeMarkers(selectedRange.get(), DocumentMarker::MisspellingMarkers()); |
+ frame().document()->markers().removeMarkers(selectedRange.get(), DocumentMarker::MisspellingMarkers()); |
} |
void SpellChecker::markMisspellingsAndBadGrammar(const VisibleSelection &movingSelection) |
@@ -414,15 +414,15 @@ void SpellChecker::markMisspellingsAfterTypingToWord(const VisiblePosition &word |
// If autocorrected word is non empty, replace the misspelled word by this word. |
if (!autocorrectedString.isEmpty()) { |
VisibleSelection newSelection(misspellingRange.get(), DOWNSTREAM); |
- if (newSelection != m_frame.selection().selection()) { |
- m_frame.selection().setSelection(newSelection); |
+ if (newSelection != frame().selection().selection()) { |
+ frame().selection().setSelection(newSelection); |
} |
- m_frame.editor().replaceSelectionWithText(autocorrectedString, false, false); |
+ frame().editor().replaceSelectionWithText(autocorrectedString, false, false); |
// Reset the charet one character further. |
- m_frame.selection().moveTo(m_frame.selection().selection().visibleEnd()); |
- m_frame.selection().modify(FrameSelection::AlterationMove, DirectionForward, CharacterGranularity); |
+ frame().selection().moveTo(frame().selection().selection().visibleEnd()); |
+ frame().selection().modify(FrameSelection::AlterationMove, DirectionForward, CharacterGranularity); |
} |
if (!isGrammarCheckingEnabled()) |
@@ -473,7 +473,7 @@ bool SpellChecker::isSpellCheckingEnabledFor(Node* node) const |
bool SpellChecker::isSpellCheckingEnabledInFocusedNode() const |
{ |
- return isSpellCheckingEnabledFor(m_frame.selection().start().deprecatedNode()); |
+ return isSpellCheckingEnabledFor(frame().selection().start().deprecatedNode()); |
} |
void SpellChecker::markMisspellings(const VisibleSelection& selection, RefPtrWillBeRawPtr<Range>& firstMisspellingRange) |
@@ -508,7 +508,7 @@ void SpellChecker::markAllMisspellingsAndBadGrammarInRanges(TextCheckingTypeMask |
Range* rangeToCheck = shouldMarkGrammar ? grammarRange : spellingRange; |
TextCheckingParagraph fullParagraphToCheck(rangeToCheck); |
- bool asynchronous = m_frame.settings() && m_frame.settings()->asynchronousSpellCheckingEnabled(); |
+ bool asynchronous = frame().settings() && frame().settings()->asynchronousSpellCheckingEnabled(); |
chunkAndMarkAllMisspellingsAndBadGrammar(textCheckingOptions, fullParagraphToCheck, asynchronous); |
} |
@@ -516,7 +516,7 @@ void SpellChecker::chunkAndMarkAllMisspellingsAndBadGrammar(Node* node) |
{ |
if (!node) |
return; |
- RefPtrWillBeRawPtr<Range> rangeToCheck = Range::create(*m_frame.document(), firstPositionInNode(node), lastPositionInNode(node)); |
+ RefPtrWillBeRawPtr<Range> rangeToCheck = Range::create(*frame().document(), firstPositionInNode(node), lastPositionInNode(node)); |
TextCheckingParagraph textToCheck(rangeToCheck, rangeToCheck); |
bool asynchronous = true; |
chunkAndMarkAllMisspellingsAndBadGrammar(resolveTextCheckingTypeMask(TextCheckingTypeSpelling | TextCheckingTypeGrammar), textToCheck, asynchronous); |
@@ -558,7 +558,7 @@ void SpellChecker::markAllMisspellingsAndBadGrammarInRanges(TextCheckingTypeMask |
if (checkingLength) |
*checkingLength = sentenceToCheck.checkingLength(); |
- RefPtr<SpellCheckRequest> request = SpellCheckRequest::create(resolveTextCheckingTypeMask(textCheckingOptions), TextCheckingProcessBatch, checkRange, paragraphRange, requestNumber); |
+ RefPtrWillBeRawPtr<SpellCheckRequest> request = SpellCheckRequest::create(resolveTextCheckingTypeMask(textCheckingOptions), TextCheckingProcessBatch, checkRange, paragraphRange, requestNumber); |
if (asynchronous) { |
m_spellCheckRequester->requestCheckingFor(request); |
@@ -569,7 +569,7 @@ void SpellChecker::markAllMisspellingsAndBadGrammarInRanges(TextCheckingTypeMask |
} |
} |
-void SpellChecker::markAndReplaceFor(PassRefPtr<SpellCheckRequest> request, const Vector<TextCheckingResult>& results) |
+void SpellChecker::markAndReplaceFor(PassRefPtrWillBeRawPtr<SpellCheckRequest> request, const Vector<TextCheckingResult>& results) |
{ |
ASSERT(request); |
@@ -587,9 +587,9 @@ void SpellChecker::markAndReplaceFor(PassRefPtr<SpellCheckRequest> request, cons |
bool adjustSelectionForParagraphBoundaries = false; |
if (shouldMarkSpelling) { |
- if (m_frame.selection().isCaret()) { |
+ if (frame().selection().isCaret()) { |
// Attempt to save the caret position so we can restore it later if needed |
- Position caretPosition = m_frame.selection().end(); |
+ Position caretPosition = frame().selection().end(); |
selectionOffset = paragraph.offsetTo(caretPosition, ASSERT_NO_EXCEPTION); |
restoreSelectionAfterChange = true; |
if (selectionOffset > 0 && (static_cast<unsigned>(selectionOffset) > paragraph.text().length() || paragraph.textCharAt(selectionOffset - 1) == newlineCharacter)) |
@@ -638,13 +638,13 @@ void SpellChecker::markAndReplaceFor(PassRefPtr<SpellCheckRequest> request, cons |
extendedParagraph.expandRangeToNextEnd(); |
if (restoreSelectionAfterChange && selectionOffset >= 0 && selectionOffset <= extendedParagraph.rangeLength()) { |
RefPtrWillBeRawPtr<Range> selectionRange = extendedParagraph.subrange(0, selectionOffset); |
- m_frame.selection().moveTo(selectionRange->endPosition(), DOWNSTREAM); |
+ frame().selection().moveTo(selectionRange->endPosition(), DOWNSTREAM); |
if (adjustSelectionForParagraphBoundaries) |
- m_frame.selection().modify(FrameSelection::AlterationMove, DirectionForward, CharacterGranularity); |
+ frame().selection().modify(FrameSelection::AlterationMove, DirectionForward, CharacterGranularity); |
} else { |
// If this fails for any reason, the fallback is to go one position beyond the last replacement |
- m_frame.selection().moveTo(m_frame.selection().selection().visibleEnd()); |
- m_frame.selection().modify(FrameSelection::AlterationMove, DirectionForward, CharacterGranularity); |
+ frame().selection().moveTo(frame().selection().selection().visibleEnd()); |
+ frame().selection().modify(FrameSelection::AlterationMove, DirectionForward, CharacterGranularity); |
} |
} |
} |
@@ -684,8 +684,8 @@ void SpellChecker::updateMarkersForWordsAffectedByEditing(bool doNotRemoveIfSele |
// Of course, if current selection is a range, we potentially will edit two words that fall on the boundaries of |
// selection, and remove words between the selection boundaries. |
// |
- VisiblePosition startOfSelection = m_frame.selection().selection().visibleStart(); |
- VisiblePosition endOfSelection = m_frame.selection().selection().visibleEnd(); |
+ VisiblePosition startOfSelection = frame().selection().selection().visibleStart(); |
+ VisiblePosition endOfSelection = frame().selection().selection().visibleEnd(); |
if (startOfSelection.isNull()) |
return; |
// First word is the word that ends after or on the start of selection. |
@@ -732,7 +732,7 @@ void SpellChecker::updateMarkersForWordsAffectedByEditing(bool doNotRemoveIfSele |
// garde", we will have CorrectionIndicator marker on both words and on the whitespace between them. If we then edit garde, |
// we would like to remove the marker from word "avant" and whitespace as well. So we need to get the continous range of |
// of marker that contains the word in question, and remove marker on that whole range. |
- Document* document = m_frame.document(); |
+ Document* document = frame().document(); |
ASSERT(document); |
RefPtrWillBeRawPtr<Range> wordRange = Range::create(*document, startOfFirstWord.deepEquivalent(), endOfLastWord.deepEquivalent()); |
document->markers().removeMarkers(wordRange.get(), DocumentMarker::MisspellingMarkers(), DocumentMarkerController::RemovePartiallyOverlappingMarker); |
@@ -749,23 +749,23 @@ void SpellChecker::didEndEditingOnTextField(Element* e) |
if (isGrammarCheckingEnabled() || unifiedTextCheckerEnabled()) |
markerTypes.add(DocumentMarker::Grammar); |
for (Node* node = innerEditor; node; node = NodeTraversal::next(*node, innerEditor)) { |
- m_frame.document()->markers().removeMarkers(node, markerTypes); |
+ frame().document()->markers().removeMarkers(node, markerTypes); |
} |
} |
void SpellChecker::replaceMisspelledRange(const String& text) |
{ |
- RefPtrWillBeRawPtr<Range> caretRange = m_frame.selection().toNormalizedRange(); |
+ RefPtrWillBeRawPtr<Range> caretRange = frame().selection().toNormalizedRange(); |
if (!caretRange) |
return; |
- DocumentMarkerVector markers = m_frame.document()->markers().markersInRange(caretRange.get(), DocumentMarker::MisspellingMarkers()); |
+ DocumentMarkerVector markers = frame().document()->markers().markersInRange(caretRange.get(), DocumentMarker::MisspellingMarkers()); |
if (markers.size() < 1 || markers[0]->startOffset() >= markers[0]->endOffset()) |
return; |
RefPtrWillBeRawPtr<Range> markerRange = Range::create(caretRange->ownerDocument(), caretRange->startContainer(), markers[0]->startOffset(), caretRange->endContainer(), markers[0]->endOffset()); |
if (!markerRange) |
return; |
- m_frame.selection().setSelection(VisibleSelection(markerRange.get()), CharacterGranularity); |
- m_frame.editor().replaceSelectionWithText(text, false, false); |
+ frame().selection().setSelection(VisibleSelection(markerRange.get()), CharacterGranularity); |
+ frame().editor().replaceSelectionWithText(text, false, false); |
} |
void SpellChecker::respondToChangedSelection(const VisibleSelection& oldSelection, FrameSelection::SetSelectionOptions options) |
@@ -776,8 +776,8 @@ void SpellChecker::respondToChangedSelection(const VisibleSelection& oldSelectio |
if (isContinuousSpellCheckingEnabled) { |
VisibleSelection newAdjacentWords; |
VisibleSelection newSelectedSentence; |
- bool caretBrowsing = m_frame.settings() && m_frame.settings()->caretBrowsingEnabled(); |
- const VisibleSelection newSelection = m_frame.selection().selection(); |
+ bool caretBrowsing = frame().settings() && frame().settings()->caretBrowsingEnabled(); |
+ const VisibleSelection newSelection = frame().selection().selection(); |
if (isSelectionInTextFormControl(newSelection)) { |
Position newStart = newSelection.start(); |
newAdjacentWords.setWithoutValidation(HTMLTextFormControlElement::startOfWord(newStart), HTMLTextFormControlElement::endOfWord(newStart)); |
@@ -812,48 +812,48 @@ void SpellChecker::respondToChangedSelection(const VisibleSelection& oldSelectio |
if (textChecker().shouldEraseMarkersAfterChangeSelection(TextCheckingTypeSpelling)) { |
Position start, end; |
if (newAdjacentWords.toNormalizedPositions(start, end)) |
- m_frame.document()->markers().removeMarkers(start, end, DocumentMarker::Spelling); |
+ frame().document()->markers().removeMarkers(start, end, DocumentMarker::Spelling); |
} |
if (textChecker().shouldEraseMarkersAfterChangeSelection(TextCheckingTypeGrammar)) { |
Position start, end; |
if (newSelectedSentence.toNormalizedPositions(start, end)) |
- m_frame.document()->markers().removeMarkers(start, end, DocumentMarker::Grammar); |
+ frame().document()->markers().removeMarkers(start, end, DocumentMarker::Grammar); |
} |
} |
// When continuous spell checking is off, existing markers disappear after the selection changes. |
if (!isContinuousSpellCheckingEnabled) |
- m_frame.document()->markers().removeMarkers(DocumentMarker::Spelling); |
+ frame().document()->markers().removeMarkers(DocumentMarker::Spelling); |
if (!isContinuousGrammarCheckingEnabled) |
- m_frame.document()->markers().removeMarkers(DocumentMarker::Grammar); |
+ frame().document()->markers().removeMarkers(DocumentMarker::Grammar); |
} |
void SpellChecker::removeSpellingMarkers() |
{ |
- m_frame.document()->markers().removeMarkers(DocumentMarker::MisspellingMarkers()); |
+ frame().document()->markers().removeMarkers(DocumentMarker::MisspellingMarkers()); |
} |
void SpellChecker::removeSpellingMarkersUnderWords(const Vector<String>& words) |
{ |
MarkerRemoverPredicate removerPredicate(words); |
- DocumentMarkerController& markerController = m_frame.document()->markers(); |
+ DocumentMarkerController& markerController = frame().document()->markers(); |
markerController.removeMarkers(removerPredicate); |
markerController.repaintMarkers(); |
} |
void SpellChecker::spellCheckAfterBlur() |
{ |
- if (!m_frame.selection().selection().isContentEditable()) |
+ if (!frame().selection().selection().isContentEditable()) |
return; |
- if (isSelectionInTextField(m_frame.selection().selection())) { |
+ if (isSelectionInTextField(frame().selection().selection())) { |
// textFieldDidEndEditing() and textFieldDidBeginEditing() handle this. |
return; |
} |
VisibleSelection empty; |
- spellCheckOldSelection(m_frame.selection().selection(), empty); |
+ spellCheckOldSelection(frame().selection().selection(), empty); |
} |
void SpellChecker::spellCheckOldSelection(const VisibleSelection& oldSelection, const VisibleSelection& newAdjacentWords) |
@@ -890,13 +890,13 @@ static Node* findFirstMarkable(Node* node) |
bool SpellChecker::selectionStartHasMarkerFor(DocumentMarker::MarkerType markerType, int from, int length) const |
{ |
- Node* node = findFirstMarkable(m_frame.selection().start().deprecatedNode()); |
+ Node* node = findFirstMarkable(frame().selection().start().deprecatedNode()); |
if (!node) |
return false; |
unsigned startOffset = static_cast<unsigned>(from); |
unsigned endOffset = static_cast<unsigned>(from + length); |
- DocumentMarkerVector markers = m_frame.document()->markers().markersFor(node); |
+ DocumentMarkerVector markers = frame().document()->markers().markersFor(node); |
for (size_t i = 0; i < markers.size(); ++i) { |
DocumentMarker* marker = markers[i]; |
if (marker->startOffset() <= startOffset && endOffset <= marker->endOffset() && marker->type() == markerType) |
@@ -927,7 +927,7 @@ TextCheckingTypeMask SpellChecker::resolveTextCheckingTypeMask(TextCheckingTypeM |
bool SpellChecker::unifiedTextCheckerEnabled() const |
{ |
- return blink::unifiedTextCheckerEnabled(&m_frame); |
+ return blink::unifiedTextCheckerEnabled(m_frame); |
} |
void SpellChecker::cancelCheck() |
@@ -941,5 +941,10 @@ void SpellChecker::requestTextChecking(const Element& element) |
m_spellCheckRequester->requestCheckingFor(SpellCheckRequest::create(TextCheckingTypeSpelling | TextCheckingTypeGrammar, TextCheckingProcessBatch, rangeToCheck, rangeToCheck)); |
} |
+void SpellChecker::trace(Visitor* visitor) |
+{ |
+ visitor->trace(m_frame); |
+ visitor->trace(m_spellCheckRequester); |
+} |
} // namespace blink |