Spelling dots are drawn in the wrong place
authormmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 6 Nov 2018 00:09:08 +0000 (00:09 +0000)
committermmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 6 Nov 2018 00:09:08 +0000 (00:09 +0000)
commitd1f44ffe3735ce3cf490e7e7906750a91b36bbca
treede5dc2577abb0bebec26b25b3cdf34e018e3513e
parent42e7664882838a2327c0c08163fb589bc0fe7215
Spelling dots are drawn in the wrong place
https://bugs.webkit.org/show_bug.cgi?id=190764

Reviewed by Dean Jackson.

Source/WebCore:

- Dots should not be clipped.
- Dots should be horizontally centered.
- Dots should be drawn behind the text.
- Distance from the baseline to the top of the dot should be 11.035% of font size.
- Dot diameter should be 13.247% of the font size.
- Distance between the dots (right side of the left dot to left side of the right dot) should be 9.457% of the font size.
- The "font size" used in these calculations should be clamped so it's 10px <= font size <= 40px.

Tests: editing/spelling/spelling-dots-position-2.html
       editing/spelling/spelling-dots-position-3.html
       editing/spelling/spelling-dots-position.html
       editing/spelling/spelling-dots-repaint.html

* platform/graphics/cocoa/GraphicsContextCocoa.mm:
(WebCore::colorForMarkerLineStyle): Align iOS and macOS implementations.
(WebCore::GraphicsContext::drawDotsForDocumentMarker): Place the dots correctly.
* rendering/InlineFlowBox.cpp:
(WebCore::InlineFlowBox::addToLine): The KnownToHaveNoOverflow flag should be cleared if the element has spelling dots,
    because there is no guarantee the spelling dots will lie inside the layout rect of the element.
(WebCore::InlineFlowBox::addTextBoxVisualOverflow): Update the repaint rects to include splling dot positions.
* rendering/InlineFlowBox.h: Comments should explain why, not say what.
* rendering/InlineTextBox.cpp:
(WebCore::InlineTextBox::paint): Draw the dots behind the text.
(WebCore::InlineTextBox::hasMarkers const): Convenience.
(WebCore::InlineTextBox::paintPlatformDocumentMarkers): Refactor bounds information into a helper function.
(WebCore::InlineTextBox::calculateUnionOfAllDocumentMarkerBounds const): Use for repaint rect calculation.
(WebCore::InlineTextBox::calculateDocumentMarkerBounds const): Place the dots correctly.
(WebCore::InlineTextBox::paintPlatformDocumentMarker): Call the helper method.
(WebCore::InlineTextBox::collectMarkedTextsForDocumentMarkers const):
(WebCore::InlineTextBox::collectMarkedTextsForDocumentMarkers): Deleted.
* rendering/InlineTextBox.h: Declare the helper methods.
* rendering/SimpleLineLayout.cpp: Simple line layout doesn't know how to paint spelling dots, so make the presence of
    spelling dots opt us out of SLL.
(WebCore::SimpleLineLayout::canUseForWithReason):
* rendering/SimpleLineLayoutCoverage.cpp:
(WebCore::SimpleLineLayout::printReason):
* rendering/SimpleLineLayoutCoverage.h: Add a new opt-out reason.

Tools:

Previously, it was impossible for WebKitTestRunner to draw spelling dots. This patch adds support for a header
at the top of test files, of the form <!-- webkit-test-runner [ spellCheckingDots=true ] --> which will cause
dots to be drawn.

* WebKitTestRunner/TestController.cpp:
(WTR::TestController::resetStateToConsistentValues):
(WTR::updateTestOptionsFromTestHeader):
(WTR::TestController::platformResetStateToConsistentValues):
* WebKitTestRunner/TestController.h:
* WebKitTestRunner/TestOptions.h:
(WTR::TestOptions::hasSameInitializationOptions const):
* WebKitTestRunner/cocoa/TestControllerCocoa.mm:
(WTR::TestController::cocoaResetStateToConsistentValues):
* WebKitTestRunner/cocoa/TestRunnerWKWebView.h:
* WebKitTestRunner/ios/TestControllerIOS.mm:
(WTR::TestController::platformResetStateToConsistentValues):
* WebKitTestRunner/mac/TestControllerMac.mm:
(WTR::TestController::platformResetStateToConsistentValues):

LayoutTests:

* editing/spelling/resources/VerySmallDescentAhem.ttf: Added. In order to test repaint rects,
      this is a version of Ahem with a very small descent, so that the dots don't intersect
      with the text itself.
* editing/spelling/spelling-dots-position-2-expected-mismatch.html: Added.
* editing/spelling/spelling-dots-position-2.html: Added. Make sure dots are painted in the
      correct vertical place.
* editing/spelling/spelling-dots-position-3-expected-mismatch.html: Added.
* editing/spelling/spelling-dots-position-3.html: Added. Make sure dots are painted in the
      correct vertical place.
* editing/spelling/spelling-dots-position-expected.html: Added.
* editing/spelling/spelling-dots-position.html: Added. Make sure dots are not painted in
      the wrong place.
* editing/spelling/spelling-dots-repaint-expected.html: Added.
* editing/spelling/spelling-dots-repaint.html: Added. Test repaint by drawing an element
      with spelling dots, and then deleting the element from the document. The spelling
      dots should be removed too.
* fast/writing-mode/english-bt-text-with-spelling-marker-expected.html:
* fast/writing-mode/english-bt-text-with-spelling-marker.html: Update the test to compensate
      for new spelling dot positions.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@237834 268f45cc-cd09-0410-ab3c-d52691b4dbfc
29 files changed:
LayoutTests/ChangeLog
LayoutTests/editing/spelling/resources/VerySmallDescentAhem.ttf [new file with mode: 0644]
LayoutTests/editing/spelling/spelling-dots-position-2-expected-mismatch.html [new file with mode: 0644]
LayoutTests/editing/spelling/spelling-dots-position-2.html [new file with mode: 0644]
LayoutTests/editing/spelling/spelling-dots-position-3-expected-mismatch.html [new file with mode: 0644]
LayoutTests/editing/spelling/spelling-dots-position-3.html [new file with mode: 0644]
LayoutTests/editing/spelling/spelling-dots-position-expected.html [new file with mode: 0644]
LayoutTests/editing/spelling/spelling-dots-position.html [new file with mode: 0644]
LayoutTests/editing/spelling/spelling-dots-repaint-expected.html [new file with mode: 0644]
LayoutTests/editing/spelling/spelling-dots-repaint.html [new file with mode: 0644]
LayoutTests/fast/writing-mode/english-bt-text-with-spelling-marker-expected.html
LayoutTests/fast/writing-mode/english-bt-text-with-spelling-marker.html
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/cocoa/GraphicsContextCocoa.mm
Source/WebCore/rendering/InlineFlowBox.cpp
Source/WebCore/rendering/InlineFlowBox.h
Source/WebCore/rendering/InlineTextBox.cpp
Source/WebCore/rendering/InlineTextBox.h
Source/WebCore/rendering/SimpleLineLayout.cpp
Source/WebCore/rendering/SimpleLineLayoutCoverage.cpp
Source/WebCore/rendering/SimpleLineLayoutCoverage.h
Tools/ChangeLog
Tools/WebKitTestRunner/TestController.cpp
Tools/WebKitTestRunner/TestController.h
Tools/WebKitTestRunner/TestOptions.h
Tools/WebKitTestRunner/cocoa/TestControllerCocoa.mm
Tools/WebKitTestRunner/cocoa/TestRunnerWKWebView.h
Tools/WebKitTestRunner/ios/TestControllerIOS.mm
Tools/WebKitTestRunner/mac/TestControllerMac.mm