[Webkit-unassigned] [Bug 53255] Reversion should not be marked as misspelled.
bugzilla-daemon at webkit.org
bugzilla-daemon at webkit.org
Mon Jan 31 18:16:33 PST 2011
https://bugs.webkit.org/show_bug.cgi?id=53255
mitz at webkit.org changed:
What |Removed |Added
----------------------------------------------------------------------------
Attachment #80458|review? |review-
Flag| |
--- Comment #5 from mitz at webkit.org 2011-01-31 18:16:33 PST ---
(From update of attachment 80458)
View in context: https://bugs.webkit.org/attachment.cgi?id=80458&action=review
I am going to say r- because of the hasMarkers() change. I don’t understand why it’s needed and it can certainly be dealt with separately from this bug.
> Source/WebCore/ChangeLog:13
> + is achieved by explicitly apply pending correction when user types space, line break or
explicitly applying?
> Source/WebCore/ChangeLog:43
> + (WebCore::markerTypesForAutocorrection): Add SpellCheckingExemption marker when apply correction.
applying!
> Source/WebCore/ChangeLog:53
> + (WebCore::Editor::markAllMisspellingsAndBadGrammarInRanges): Don't marker mispelling if the
typo: marker -> mark
> Source/WebCore/dom/DocumentMarker.h:44
> + // correction. Text with Replacement marker don't necessarilly has CorrectionIndicator
typo: don't -> doesn't, necessarilly -> necessarily
> Source/WebCore/dom/DocumentMarker.h:45
> + // marker. For instance, after some text has been corrected, it will has both Replacement
has->have
> Source/WebCore/dom/DocumentMarkerController.cpp:591
> - Node* startContainer = range->startContainer();
> - ASSERT(startContainer);
> - Node* endContainer = range->endContainer();
> - ASSERT(endContainer);
> -
> - Node* pastLastNode = range->pastLastNode();
> - for (Node* node = range->firstNode(); node != pastLastNode; node = node->traverseNextNode()) {
> + TextIterator it(range);
> +
> + // Need special handling on first and last node.
> + RefPtr<Range> firstRange = it.range();
> + Node* firstNode = firstRange->startContainer();
> + RefPtr<Range> previousRange = firstRange;
> + it.advance();
> + for (; !it.atEnd(); it.advance()) {
> + Node* node = previousRange->startContainer();
> + // In this loop, we check every node between (excluding) the first and last node.
> + if (node == firstNode)
> + continue;
> Vector<DocumentMarker> markers = markersForNode(node);
> - Vector<DocumentMarker>::const_iterator end = markers.end();
> - for (Vector<DocumentMarker>::const_iterator it = markers.begin(); it != end; ++it) {
> - if (!(markerTypes & it->type))
> - continue;
> - if (node == startContainer && node == endContainer) {
> - // The range spans only one node.
> - if (it->endOffset > static_cast<unsigned>(range->startOffset()) && it->startOffset < static_cast<unsigned>(range->endOffset()))
> - return true;
> - } else {
> - if (node == startContainer) {
> - if (it->endOffset > static_cast<unsigned>(range->startOffset()))
> - return true;
> - } else if (node == endContainer) {
> - if (it->startOffset < static_cast<unsigned>(range->endOffset()))
> - return true;
> - } else
> - return true;
> - }
> + size_t size = markers.size();
> + for (size_t i = 0; i < size; ++i) {
> + const DocumentMarker& marker = markers[i];
> + if (marker.type & markerTypes)
> + return true;
> + }
> + previousRange = it.range();
> + }
> +
> + RefPtr<Range> lastRange = previousRange;
> + Node* lastNode = lastRange->startContainer();
> +
> + // Check the first node.
> + Vector<DocumentMarker> markers = markersForNode(firstNode);
> + size_t size = markers.size();
> + for (size_t i = 0; i < size; ++i) {
> + const DocumentMarker& marker = markers[i];
> + if (!(marker.type & markerTypes))
> + continue;
> + if (firstNode == lastNode) {
> + if (marker.endOffset > static_cast<unsigned>(firstRange->startOffset()) && marker.startOffset < static_cast<unsigned>(lastRange->endOffset()))
> + return true;
> + } else {
> + if (marker.endOffset > static_cast<unsigned>(firstRange->startOffset()))
> + return true;
> }
> }
> +
> + if (firstNode == lastNode)
> + return false;
> + // Didn't find relevant mark in all other nodes. Now check the last node.
> + markers = markersForNode(lastNode);
> + size = markers.size();
> + for (size_t i = 0; i < size; ++i) {
> + const DocumentMarker& marker = markers[i];
> + if (!(marker.type & markerTypes))
> + continue;
> + if (marker.startOffset < static_cast<unsigned>(lastRange->endOffset()))
> + return true;
> + }
> +
The new code is more complex and harder to follow than the old code. I also don’t think that a TextIterator is more efficient than node traversal.
> Source/WebCore/editing/Editor.cpp:2678
> + document->markers()->removeMarkers(wordRange.get(), DocumentMarker::Spelling | DocumentMarker::CorrectionIndicator | DocumentMarker::SpellCheckingExemption, true);
This mysterious “true” at the call site suggests that the parameter should be an enum.
> Source/WebCore/editing/Editor.cpp:2736
> + // Only apply correction if current correction panel type is PanelTypeCorrection.
This comment is redundant with the following code.
> Source/WebCore/editing/Editor.cpp:2740
> + // Only apply correction if the caret is at the end of the range to be replaced.
Even this comment doesn’t add much. Perhaps you could explain the motivation instead.
--
Configure bugmail: https://bugs.webkit.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
More information about the webkit-unassigned
mailing list