Skip to content

Commit

Permalink
Cherry-pick 9e34390. rdar://123328041
Browse files Browse the repository at this point in the history
    REGRESSION (271515@main): Bold and Italic keyboard bar button items in the UCB never update
    https://bugs.webkit.org/show_bug.cgi?id=270169
    rdar://123328041

    Reviewed by Tim Horton.

    The changes in 271515@main were meant to merge functionality in both the public API delegate method
    `-textStylingAtPosition:inDirection:` and the UIKit IPI `-fontForCaretSelection` into just the
    public API. However, this removed logic for setting symbolic traits on the font descriptor (bold,
    italic) with no replacement.

    Fix this by reinstating this code, and augmenting an existing API test to exercise this logic.

    Test: AutocorrectionTests.FontAtCaretWhenUsingUICTFontTextStyle

    * Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm:
    (-[WKContentView textStylingAtPosition:inDirection:]):
    * Tools/TestWebKitAPI/Tests/ios/AutocorrectionTestsIOS.mm:
    (-[UIFont _test_systemFontWithSize:traits:]):

    Canonical link: https://commits.webkit.org/275396@main

Canonical link: https://commits.webkit.org/272448.641@safari-7618-branch
  • Loading branch information
whsieh authored and Dan Robson committed Feb 28, 2024
1 parent b6258f0 commit d0981d7
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 9 deletions.
25 changes: 19 additions & 6 deletions Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm
Original file line number Diff line number Diff line change
Expand Up @@ -4279,15 +4279,28 @@ - (NSDictionary *)textStylingAtPosition:(UITextPosition *)position inDirection:(
return result;

auto typingAttributes = _page->editorState().postLayoutData->typingAttributes;
UIFont *font = _autocorrectionData.font.get();

RetainPtr font = _autocorrectionData.font.get();
double zoomScale = self._contentZoomScale;
if (std::abs(zoomScale - 1) > FLT_EPSILON)
font = [font fontWithSize:font.pointSize * zoomScale];
font = [font fontWithSize:[font pointSize] * zoomScale];

if (font) {
auto originalTraits = [font fontDescriptor].symbolicTraits;
auto newTraits = originalTraits;
if (typingAttributes.contains(WebKit::TypingAttribute::Bold))
newTraits |= UIFontDescriptorTraitBold;

if (typingAttributes.contains(WebKit::TypingAttribute::Italics))
newTraits |= UIFontDescriptorTraitItalic;

if (originalTraits != newTraits) {
RetainPtr descriptor = [[font fontDescriptor] ?: adoptNS([UIFontDescriptor new]) fontDescriptorWithSymbolicTraits:newTraits];
font = [UIFont fontWithDescriptor:descriptor.get() size:[font pointSize]];
}
[result setObject:font.get() forKey:NSFontAttributeName];
}

if (font)
[result setObject:font forKey:NSFontAttributeName];

if (typingAttributes.contains(WebKit::TypingAttribute::Underline))
[result setObject:@(NSUnderlineStyleSingle) forKey:NSUnderlineStyleAttributeName];

Expand Down
28 changes: 25 additions & 3 deletions Tools/TestWebKitAPI/Tests/ios/AutocorrectionTestsIOS.mm
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,17 @@
#import <WebKitAdditions/ServiceExtensionsAdditions.h>
#endif

@implementation UIFont (TestWebKitAPI)

+ (instancetype)_test_systemFontWithSize:(CGFloat)size traits:(UIFontDescriptorSymbolicTraits)traits
{
auto font = [self systemFontOfSize:size];
auto newDescriptor = [font.fontDescriptor fontDescriptorWithSymbolicTraits:traits];
return [self fontWithDescriptor:newDescriptor size:0];
}

@end

static void checkCGRectIsNotEmpty(CGRect rect)
{
BOOL isEmpty = CGRectIsEmpty(rect);
Expand All @@ -59,7 +70,10 @@ static void checkCGRectIsNotEmpty(CGRect rect)

[webView _setInputDelegate:inputDelegate.get()];
[webView _setEditable:YES];
[webView synchronouslyLoadHTMLString:@"<meta name='viewport' content='width=device-width, initial-scale=1'><body style='font-size: 16px; font-family: UICTFontTextStyleBody'>Wulk</body>"];
[webView synchronouslyLoadHTMLString:@"<meta name='viewport' content='width=device-width, initial-scale=1'>"
"<body style='font-size: 16px; font-family: UICTFontTextStyleBody; font-weight: bold;'>"
"<em>Wulk</em>"
"</body>"];
[webView evaluateJavaScriptAndWaitForInputSessionToChange:@"document.body.focus()"];
[webView _executeEditCommand:@"MoveToEndOfLine" argument:nil completion:nil];

Expand All @@ -71,19 +85,27 @@ static void checkCGRectIsNotEmpty(CGRect rect)
auto selectedTextRangeBeforeScaling = contentView.selectedTextRange;
auto stylingDictionaryBeforeScaling = [contentView textStylingAtPosition:selectedTextRangeBeforeScaling.start inDirection:UITextStorageDirectionForward];
UIFont *fontBeforeScaling = [stylingDictionaryBeforeScaling objectForKey:NSFontAttributeName];
UIFont *size16SystemFont = [UIFont systemFontOfSize:16];
UIFont *size16SystemFont = [UIFont _test_systemFontWithSize:16 traits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic];
EXPECT_WK_STREQ(size16SystemFont.fontName, fontBeforeScaling.fontName);
EXPECT_WK_STREQ(size16SystemFont.familyName, fontBeforeScaling.familyName);
EXPECT_EQ(16, fontBeforeScaling.pointSize);

auto traitsBeforeScaling = fontBeforeScaling.fontDescriptor.symbolicTraits;
EXPECT_TRUE(traitsBeforeScaling & UIFontDescriptorTraitBold);
EXPECT_TRUE(traitsBeforeScaling & UIFontDescriptorTraitItalic);

[webView scrollView].zoomScale = 2;
auto selectedTextRangeAfterScaling = contentView.selectedTextRange;
auto stylingDictionaryAfterScaling = [contentView textStylingAtPosition:selectedTextRangeAfterScaling.start inDirection:UITextStorageDirectionForward];
UIFont *fontAfterScaling = [stylingDictionaryAfterScaling objectForKey:NSFontAttributeName];
UIFont *size32SystemFont = [UIFont systemFontOfSize:32];
UIFont *size32SystemFont = [UIFont _test_systemFontWithSize:32 traits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic];
EXPECT_WK_STREQ(size32SystemFont.fontName, fontAfterScaling.fontName);
EXPECT_WK_STREQ(size32SystemFont.familyName, fontAfterScaling.familyName);
EXPECT_EQ(32, fontAfterScaling.pointSize);

auto traitsAfterScaling = fontBeforeScaling.fontDescriptor.symbolicTraits;
EXPECT_TRUE(traitsAfterScaling & UIFontDescriptorTraitBold);
EXPECT_TRUE(traitsAfterScaling & UIFontDescriptorTraitItalic);
}

TEST(AutocorrectionTests, RequestAutocorrectionContextAfterClosingPage)
Expand Down

0 comments on commit d0981d7

Please sign in to comment.