/*
 * Copyright (C) 2018 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#import "config.h"
#import "Test.h"

#if PLATFORM(MAC)

#import "AppKitSPI.h"
#import "NSFontPanelTesting.h"
#import "PlatformUtilities.h"
#import "TestFontOptions.h"
#import "TestInspectorBar.h"
#import "TestWKWebView.h"
#import <WebKit/WKWebViewPrivate.h>

@interface WKWebView (NSTextInputClient_Async) <NSTextInputClient_Async, NSTextInputClient_Async_Staging_44648564, NSInspectorBarClient>
@end

@interface TestWKWebView (FontManagerTests)

@property (nonatomic, readonly) NSString *selectedText;

- (NSDictionary<NSString *, id> *)typingAttributes;
- (void)selectNextWord;

@end

@interface FontManagerTestWKWebView : TestWKWebView
@end

@implementation FontManagerTestWKWebView

- (NSArray<NSString *> *)inspectorBarItemIdentifiers
{
    return [TestInspectorBar standardTextItemIdentifiers];
}

@end

@implementation TestWKWebView (FontManagerTests)

- (NSDictionary<NSString *, id> *)typingAttributes
{
    __block bool done = false;
    __block RetainPtr<NSDictionary> result;
    [self typingAttributesWithCompletionHandler:^(NSDictionary<NSString *, id> *attributes) {
        result = attributes;
        done = true;
    }];
    TestWebKitAPI::Util::run(&done);
    return result.autorelease();
}

- (NSString *)selectedText
{
    return [self stringByEvaluatingJavaScript:@"getSelection().toString()"];
}

- (void)selectNextWord
{
    [self moveRight:nil];
    [self moveRight:nil];
    [self selectWord:nil];
}

@end

static RetainPtr<FontManagerTestWKWebView> webViewForFontManagerTesting(NSFontManager *fontManager, NSString *markup)
{
    auto webView = adoptNS([[FontManagerTestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400)]);
    [webView synchronouslyLoadHTMLString:markup];
    [webView stringByEvaluatingJavaScript:@"document.body.focus()"];
    [webView _setEditable:YES];
    fontManager.target = webView.get();
    return webView;
}

static RetainPtr<FontManagerTestWKWebView> webViewForFontManagerTesting(NSFontManager *fontManager)
{
    return webViewForFontManagerTesting(fontManager, @"<body contenteditable>"
        "<span id='foo'>foo</span> <span id='bar'>bar</span> <span id='baz'>baz</span>"
        "</body><script>document.body.addEventListener('input', event => lastInputEvent = event)</script>");
}

static RetainPtr<NSMenuItemCell> menuItemCellForFontAction(NSUInteger tag)
{
    auto menuItem = adoptNS([[NSMenuItem alloc] init]);
    auto menuItemCell = adoptNS([[NSMenuItemCell alloc] init]);
    [menuItemCell setMenuItem:menuItem.get()];
    [menuItemCell setTag:tag];
    return menuItemCell;
}

namespace TestWebKitAPI {

TEST(FontManagerTests, ToggleBoldAndItalicWithMenuItems)
{
    NSFontManager *fontManager = NSFontManager.sharedFontManager;
    auto webView = webViewForFontManagerTesting(fontManager);

    [webView selectWord:nil];
    [webView waitForNextPresentationUpdate];
    [fontManager addFontTrait:menuItemCellForFontAction(NSBoldFontMask).get()];
    EXPECT_WK_STREQ("700", [webView stylePropertyAtSelectionStart:@"font-weight"]);
    EXPECT_WK_STREQ("700", [webView stylePropertyAtSelectionEnd:@"font-weight"]);
    EXPECT_WK_STREQ("Times-Bold", [fontManager selectedFont].fontName);

    [fontManager addFontTrait:menuItemCellForFontAction(NSUnboldFontMask).get()];
    EXPECT_WK_STREQ("400", [webView stylePropertyAtSelectionStart:@"font-weight"]);
    EXPECT_WK_STREQ("400", [webView stylePropertyAtSelectionEnd:@"font-weight"]);
    EXPECT_WK_STREQ("Times-Roman", [fontManager selectedFont].fontName);

    [fontManager addFontTrait:menuItemCellForFontAction(NSItalicFontMask).get()];
    EXPECT_WK_STREQ("italic", [webView stylePropertyAtSelectionStart:@"font-style"]);
    EXPECT_WK_STREQ("italic", [webView stylePropertyAtSelectionEnd:@"font-style"]);
    EXPECT_WK_STREQ("Times-Italic", [fontManager selectedFont].fontName);

    [fontManager addFontTrait:menuItemCellForFontAction(NSUnitalicFontMask).get()];
    EXPECT_WK_STREQ("normal", [webView stylePropertyAtSelectionStart:@"font-style"]);
    EXPECT_WK_STREQ("normal", [webView stylePropertyAtSelectionEnd:@"font-style"]);
    EXPECT_WK_STREQ("Times-Roman", [fontManager selectedFont].fontName);
}

TEST(FontManagerTests, ChangeFontSizeWithMenuItems)
{
    NSFontManager *fontManager = NSFontManager.sharedFontManager;
    auto webView = webViewForFontManagerTesting(fontManager);

    auto sizeIncreaseMenuItemCell = menuItemCellForFontAction(NSSizeUpFontAction);
    auto sizeDecreaseMenuItemCell = menuItemCellForFontAction(NSSizeDownFontAction);

    // Select "foo" and increase font size.
    [webView selectWord:nil];
    [webView waitForNextPresentationUpdate];
    [fontManager modifyFont:sizeIncreaseMenuItemCell.get()];
    [fontManager modifyFont:sizeIncreaseMenuItemCell.get()];

    // Now select "baz" and decrease font size.
    [webView moveToEndOfParagraph:nil];
    [webView selectWord:nil];
    [webView waitForNextPresentationUpdate];
    [fontManager modifyFont:sizeDecreaseMenuItemCell.get()];
    [fontManager modifyFont:sizeDecreaseMenuItemCell.get()];

    // Lastly, select just the "r" in "bar" and increase font size.
    [webView evaluateJavaScript:@"getSelection().setBaseAndExtent(bar.childNodes[0], 2, bar.childNodes[0], 3)" completionHandler:nil];
    [fontManager modifyFont:sizeIncreaseMenuItemCell.get()];

    [webView moveToBeginningOfParagraph:nil];
    [webView selectWord:nil];
    [webView waitForNextPresentationUpdate];
    EXPECT_WK_STREQ(@"foo", [webView selectedText]);
    EXPECT_WK_STREQ(@"18px", [webView stylePropertyAtSelectionStart:@"font-size"]);
    EXPECT_WK_STREQ(@"18px", [webView stylePropertyAtSelectionEnd:@"font-size"]);

    [webView selectNextWord];
    EXPECT_WK_STREQ(@"bar", [webView selectedText]);
    EXPECT_WK_STREQ(@"16px", [webView stylePropertyAtSelectionStart:@"font-size"]);
    EXPECT_WK_STREQ(@"17px", [webView stylePropertyAtSelectionEnd:@"font-size"]);

    [webView selectNextWord];
    EXPECT_WK_STREQ(@"baz", [webView selectedText]);
    EXPECT_WK_STREQ(@"14px", [webView stylePropertyAtSelectionStart:@"font-size"]);
    EXPECT_WK_STREQ(@"14px", [webView stylePropertyAtSelectionEnd:@"font-size"]);
}

TEST(FontManagerTests, ChangeFontWithPanel)
{
    NSFontManager *fontManager = NSFontManager.sharedFontManager;
    auto webView = webViewForFontManagerTesting(fontManager);

    NSFontPanel *fontPanel = [fontManager fontPanel:YES];
    [fontPanel setIsVisible:YES];
    [webView waitForNextPresentationUpdate];

    NSFont *largeHelveticaFont = [NSFont fontWithName:@"Helvetica" size:20];
    [fontPanel setPanelFont:largeHelveticaFont isMultiple:NO];
    [webView selectWord:nil];
    [fontManager modifyFontViaPanel:fontPanel];
    EXPECT_WK_STREQ("foo", [webView selectedText]);
    EXPECT_WK_STREQ("Helvetica", [webView stylePropertyAtSelectionStart:@"font-family"]);
    EXPECT_WK_STREQ("20px", [webView stylePropertyAtSelectionStart:@"font-size"]);
    EXPECT_WK_STREQ("400", [webView stylePropertyAtSelectionStart:@"font-weight"]);
    EXPECT_EQ(largeHelveticaFont, fontManager.selectedFont);

    NSFont *smallBoldTimesFont = [fontManager fontWithFamily:@"Times New Roman" traits:NSBoldFontMask weight:NSFontWeightBold size:10];
    [fontPanel setPanelFont:smallBoldTimesFont isMultiple:NO];
    [webView selectNextWord];
    [fontManager modifyFontViaPanel:fontPanel];
    EXPECT_WK_STREQ("bar", [webView selectedText]);
    EXPECT_WK_STREQ("\"Times New Roman\"", [webView stylePropertyAtSelectionStart:@"font-family"]);
    EXPECT_WK_STREQ("10px", [webView stylePropertyAtSelectionStart:@"font-size"]);
    EXPECT_WK_STREQ("700", [webView stylePropertyAtSelectionStart:@"font-weight"]);
    EXPECT_EQ(smallBoldTimesFont, fontManager.selectedFont);

    NSFont *boldItalicArialFont = [fontManager fontWithFamily:@"Arial" traits:NSBoldFontMask | NSItalicFontMask weight:NSFontWeightBold size:14];
    [fontPanel setPanelFont:boldItalicArialFont isMultiple:NO];
    [webView selectNextWord];
    [fontManager modifyFontViaPanel:fontPanel];
    EXPECT_WK_STREQ("baz", [webView selectedText]);
    EXPECT_WK_STREQ("Arial", [webView stylePropertyAtSelectionStart:@"font-family"]);
    EXPECT_WK_STREQ("14px", [webView stylePropertyAtSelectionStart:@"font-size"]);
    EXPECT_WK_STREQ("700", [webView stylePropertyAtSelectionStart:@"font-weight"]);
    EXPECT_EQ(boldItalicArialFont, fontManager.selectedFont);

    NSFont *largeItalicLightAvenirFont = [fontManager fontWithFamily:@"Avenir" traits:NSItalicFontMask weight:NSFontWeightLight size:24];
    [fontPanel setPanelFont:largeItalicLightAvenirFont isMultiple:NO];
    [webView selectAll:nil];
    [fontManager modifyFontViaPanel:fontPanel];
    EXPECT_WK_STREQ("foo bar baz", [webView selectedText]);
    EXPECT_WK_STREQ("Avenir-LightOblique", [webView stylePropertyAtSelectionStart:@"font-family"]);
    EXPECT_WK_STREQ("24px", [webView stylePropertyAtSelectionStart:@"font-size"]);
    EXPECT_WK_STREQ("400", [webView stylePropertyAtSelectionStart:@"font-weight"]);
    EXPECT_EQ(largeItalicLightAvenirFont, fontManager.selectedFont);
}

TEST(FontManagerTests, ChangeAttributesWithFontEffectsBox)
{
    NSFontManager *fontManager = NSFontManager.sharedFontManager;
    auto webView = webViewForFontManagerTesting(fontManager);

    NSFontPanel *fontPanel = [fontManager fontPanel:YES];
    [fontPanel setIsVisible:YES];
    [webView waitForNextPresentationUpdate];

    auto textDecorationsAroundSelection = [webView] {
        NSString *decorationsAtStart = [webView stylePropertyAtSelectionStart:@"-webkit-text-decorations-in-effect"];
        NSString *decorationsAtEnd = [webView stylePropertyAtSelectionEnd:@"-webkit-text-decorations-in-effect"];
        if ([decorationsAtStart isEqualToString:decorationsAtEnd] || decorationsAtStart == decorationsAtEnd)
            return decorationsAtStart;
        return [NSString stringWithFormat:@"(%@, %@)", decorationsAtStart, decorationsAtEnd];
    };

    auto textShadowAroundSelection = [webView] {
        NSString *shadowAtStart = [webView stylePropertyAtSelectionStart:@"text-shadow"];
        NSString *shadowAtEnd = [webView stylePropertyAtSelectionEnd:@"text-shadow"];
        if ([shadowAtStart isEqualToString:shadowAtEnd] || shadowAtStart == shadowAtEnd)
            return shadowAtStart;
        return [NSString stringWithFormat:@"(%@, %@)", shadowAtStart, shadowAtEnd];
    };

    [webView selectWord:nil];
    [fontPanel chooseUnderlineMenuItemWithTitle:@"single"];
    EXPECT_WK_STREQ("foo", [webView selectedText]);
    EXPECT_WK_STREQ("underline", textDecorationsAroundSelection());

    [fontPanel chooseUnderlineMenuItemWithTitle:@"none"];
    EXPECT_WK_STREQ("none", textDecorationsAroundSelection());

    [webView selectNextWord];
    [fontPanel chooseStrikeThroughMenuItemWithTitle:@"single"];
    EXPECT_WK_STREQ("bar", [webView selectedText]);
    EXPECT_WK_STREQ("line-through", textDecorationsAroundSelection());
    EXPECT_EQ(NSUnderlineStyleSingle, [[webView typingAttributes][NSStrikethroughStyleAttributeName] intValue]);

    [fontPanel chooseStrikeThroughMenuItemWithTitle:@"none"];
    EXPECT_WK_STREQ("none", textDecorationsAroundSelection());
    EXPECT_EQ(NSUnderlineStyleNone, [[webView typingAttributes][NSStrikethroughStyleAttributeName] intValue]);

    [webView selectNextWord];
    fontPanel.shadowBlur = 8;
    fontPanel.shadowOpacity = 1;
    [fontPanel toggleShadow];
    EXPECT_WK_STREQ("baz", [webView selectedText]);
    EXPECT_WK_STREQ("rgb(0, 0, 0) 0px 1.25px 8px", textShadowAroundSelection());
    {
        NSShadow *shadow = [webView typingAttributes][NSShadowAttributeName];
        EXPECT_EQ(shadow.shadowOffset.width, 0);
        EXPECT_EQ(shadow.shadowOffset.height, 1.25);
        EXPECT_EQ(shadow.shadowBlurRadius, 8);
        EXPECT_TRUE([shadow.shadowColor isEqual:[NSColor colorWithRed:0 green:0 blue:0 alpha:1]]);
    }

    [fontPanel toggleShadow];
    EXPECT_WK_STREQ("none", textShadowAroundSelection());
    EXPECT_NULL([webView typingAttributes][NSShadowAttributeName]);

    // Now combine all three attributes together.
    [webView selectAll:nil];
    fontPanel.shadowBlur = 5;
    fontPanel.shadowOpacity = 0.2;
    [fontPanel toggleShadow];
    [fontPanel chooseUnderlineMenuItemWithTitle:@"single"];
    [fontPanel chooseStrikeThroughMenuItemWithTitle:@"single"];
    EXPECT_WK_STREQ("foo bar baz", [webView selectedText]);
    EXPECT_WK_STREQ("rgba(0, 0, 0, 0.2) 0px 1.25px 5px", textShadowAroundSelection());
    EXPECT_WK_STREQ("underline line-through", textDecorationsAroundSelection());
    {
        NSDictionary *typingAttributes = [webView typingAttributes];
        EXPECT_EQ(NSUnderlineStyleSingle, [typingAttributes[NSUnderlineStyleAttributeName] intValue]);
        EXPECT_EQ(NSUnderlineStyleSingle, [typingAttributes[NSStrikethroughStyleAttributeName] intValue]);

        NSShadow *shadow = typingAttributes[NSShadowAttributeName];
        EXPECT_EQ(shadow.shadowOffset.width, 0);
        EXPECT_EQ(shadow.shadowOffset.height, 1.25);
        EXPECT_EQ(shadow.shadowBlurRadius, 5);
        EXPECT_TRUE([shadow.shadowColor isEqual:[NSColor colorWithRed:0 green:0 blue:0 alpha:0.2]]);
    }

    [fontPanel toggleShadow];
    [fontPanel chooseUnderlineMenuItemWithTitle:@"none"];
    [fontPanel chooseStrikeThroughMenuItemWithTitle:@"none"];
    EXPECT_WK_STREQ("none", textShadowAroundSelection());
    EXPECT_WK_STREQ("none", textDecorationsAroundSelection());
    EXPECT_EQ(NSUnderlineStyleNone, [[webView typingAttributes][NSStrikethroughStyleAttributeName] intValue]);
    EXPECT_NULL([webView typingAttributes][NSShadowAttributeName]);
}

TEST(FontManagerTests, ChangeFontColorWithColorPanel)
{
    NSColorPanel *colorPanel = NSColorPanel.sharedColorPanel;
    colorPanel.showsAlpha = YES;

    auto webView = webViewForFontManagerTesting(NSFontManager.sharedFontManager);
    auto checkFontColorAtStartAndEndWithInputEvents = [webView] (const char* colorAsString) {
        EXPECT_WK_STREQ(colorAsString, [webView stylePropertyAtSelectionStart:@"color"]);
        EXPECT_WK_STREQ(colorAsString, [webView stylePropertyAtSelectionEnd:@"color"]);
        EXPECT_WK_STREQ("formatFontColor", [webView stringByEvaluatingJavaScript:@"lastInputEvent.inputType"]);
        EXPECT_WK_STREQ(colorAsString, [webView stringByEvaluatingJavaScript:@"lastInputEvent.data"]);
    };

    // 1. Select "foo" and turn it red; verify that the font element is used for fully opaque colors.
    colorPanel.color = [NSColor colorWithRed:1 green:0 blue:0 alpha:1];
    [webView selectWord:nil];
    [webView waitForNextPresentationUpdate];
    [webView changeColor:colorPanel];
    checkFontColorAtStartAndEndWithInputEvents("rgb(255, 0, 0)");
    EXPECT_TRUE([[webView objectByEvaluatingJavaScript:@"!!foo.querySelector('font')"] boolValue]);

    // 2. Now select "bar" and try a few different colors, starting with a color with alpha.
    colorPanel.color = [NSColor colorWithWhite:1 alpha:0.2];
    [webView selectNextWord];
    [webView waitForNextPresentationUpdate];
    [webView changeColor:colorPanel];
    checkFontColorAtStartAndEndWithInputEvents("rgba(255, 255, 255, 0.2)");
    EXPECT_FALSE([[webView objectByEvaluatingJavaScript:@"!!bar.querySelector('font')"] boolValue]);

    // 3a. Switch back to a solid color.
    colorPanel.color = [NSColor colorWithRed:0.8 green:0.7 blue:0.2 alpha:1];
    [webView changeColor:colorPanel];
    checkFontColorAtStartAndEndWithInputEvents("rgb(204, 179, 51)");
    EXPECT_TRUE([[webView objectByEvaluatingJavaScript:@"!!bar.querySelector('font')"] boolValue]);

    // 3b. Switch back again to a color with alpha.
    colorPanel.color = [NSColor colorWithRed:0.8 green:0.7 blue:0.2 alpha:0.2];
    [webView changeColor:colorPanel];
    checkFontColorAtStartAndEndWithInputEvents("rgba(204, 179, 51, 0.2)");
    EXPECT_FALSE([[webView objectByEvaluatingJavaScript:@"!!bar.querySelector('font')"] boolValue]);

    // 4a. Now collapse the selection to the end and set the typing style color to green.
    colorPanel.color = [NSColor colorWithRed:0 green:1 blue:0 alpha:1];
    [webView collapseToEnd];
    [webView changeColor:colorPanel];
    EXPECT_WK_STREQ("formatFontColor", [webView stringByEvaluatingJavaScript:@"lastInputEvent.inputType"]);
    EXPECT_WK_STREQ("rgb(0, 255, 0)", [webView stringByEvaluatingJavaScript:@"lastInputEvent.data"]);

    // 4b. This should result in inserting green text.
    [webView insertText:@"green"];
    [webView moveWordBackward:nil];
    [webView selectWord:nil];
    EXPECT_WK_STREQ("rgba(204, 179, 51, 0.2)", [webView stylePropertyAtSelectionStart:@"color"]);
    EXPECT_WK_STREQ("rgb(0, 255, 0)", [webView stylePropertyAtSelectionEnd:@"color"]);
}

TEST(FontManagerTests, ChangeTypingAttributesWithInspectorBar)
{
    auto webView = webViewForFontManagerTesting(NSFontManager.sharedFontManager);
    auto inspectorBar = adoptNS([[TestInspectorBar alloc] initWithWebView:webView.get()]);
    {
        [webView selectAll:nil];
        NSFont *originalFont = [webView typingAttributes][NSFontAttributeName];
        EXPECT_WK_STREQ("Times", originalFont.familyName);
        EXPECT_EQ(16, originalFont.pointSize);
    }
    {
        // Change font family.
        [inspectorBar chooseFontFamily:@"Helvetica"];
        [webView waitForNextPresentationUpdate];
        NSFont *fontAfterSpecifyingHelvetica = [webView typingAttributes][NSFontAttributeName];
        EXPECT_WK_STREQ("Helvetica", fontAfterSpecifyingHelvetica.familyName);
        EXPECT_EQ(16, fontAfterSpecifyingHelvetica.pointSize);
    }
    {
        // Change font size.
        [webView collapseToStart];
        [webView selectWord:nil];
        [inspectorBar chooseFontSize:32];
        [webView collapseToEnd];
        [webView waitForNextPresentationUpdate];
        NSFont *fontAfterDoublingFontSize = [webView typingAttributes][NSFontAttributeName];
        EXPECT_WK_STREQ("Helvetica", fontAfterDoublingFontSize.familyName);
        EXPECT_EQ(32, fontAfterDoublingFontSize.pointSize);
    }
    {
        // Bold, italic, and underline.
        [webView selectNextWord];
        [inspectorBar formatBold:YES];
        [inspectorBar formatItalic:YES];
        [inspectorBar formatUnderline:YES];
        [webView waitForNextPresentationUpdate];
        NSDictionary *attributes = [webView typingAttributes];
        EXPECT_WK_STREQ("Helvetica-BoldOblique", [attributes[NSFontAttributeName] fontName]);
        EXPECT_EQ(16, [attributes[NSFontAttributeName] pointSize]);
        EXPECT_EQ(NSUnderlineStyleSingle, [attributes[NSUnderlineStyleAttributeName] integerValue]);
    }
    {
        // Add foreground and background colors.
        [webView selectNextWord];
        NSColor *foregroundColor = [NSColor colorWithRed:1 green:1 blue:1 alpha:0.2];
        NSColor *backgroundColor = [NSColor colorWithRed:0.8 green:0.2 blue:0.6 alpha:1];
        [inspectorBar chooseForegroundColor:foregroundColor];
        [inspectorBar chooseBackgroundColor:backgroundColor];
        [webView waitForNextPresentationUpdate];
        NSDictionary *attributes = [webView typingAttributes];
        EXPECT_TRUE([attributes[NSForegroundColorAttributeName] isEqual:foregroundColor]);
        EXPECT_TRUE([attributes[NSBackgroundColorAttributeName] isEqual:backgroundColor]);
    }
}

TEST(FontManagerTests, TypingAttributesAfterSubscriptAndSuperscript)
{
    auto webView = webViewForFontManagerTesting(NSFontManager.sharedFontManager);

    [webView moveToBeginningOfDocument:nil];
    [webView selectWord:nil];
    [webView superscript:nil];
    [webView waitForNextPresentationUpdate];
    EXPECT_EQ(1, [[webView typingAttributes][NSSuperscriptAttributeName] integerValue]);

    [webView selectNextWord];
    [webView subscript:nil];
    [webView waitForNextPresentationUpdate];
    EXPECT_EQ(-1, [[webView typingAttributes][NSSuperscriptAttributeName] integerValue]);

    [webView selectNextWord];
    [webView subscript:nil];
    [webView unscript:nil];
    [webView waitForNextPresentationUpdate];
    EXPECT_EQ(0, [[webView typingAttributes][NSSuperscriptAttributeName] integerValue]);
}

TEST(FontManagerTests, AddFontShadowUsingFontOptions)
{
    TestFontOptions *options = TestFontOptions.sharedInstance;
    auto webView = webViewForFontManagerTesting(NSFontManager.sharedFontManager);

    [webView selectWord:nil];
    [webView waitForNextPresentationUpdate];
    options.shadowWidth = 3;
    options.shadowHeight = -3;
    options.hasShadow = YES;

    EXPECT_WK_STREQ("rgba(0, 0, 0, 0.333) 3px -3px 0px", [webView stylePropertyAtSelectionStart:@"text-shadow"]);
    [webView waitForNextPresentationUpdate];
    NSShadow *shadow = [webView typingAttributes][NSShadowAttributeName];
    EXPECT_EQ(shadow.shadowOffset.width, 3);
    EXPECT_EQ(shadow.shadowOffset.height, -3);
}

TEST(FontManagerTests, AddAndRemoveColorsUsingFontOptions)
{
    TestFontOptions *options = TestFontOptions.sharedInstance;
    auto webView = webViewForFontManagerTesting(NSFontManager.sharedFontManager, @"<body contenteditable>hello</body>");
    [webView selectWord:nil];
    [webView waitForNextPresentationUpdate];

    options.backgroundColor = [NSColor colorWithRed:1 green:0 blue:0 alpha:0.2];
    options.foregroundColor = [NSColor colorWithRed:0 green:0 blue:1 alpha:1];

    EXPECT_WK_STREQ("rgb(0, 0, 255)", [webView stylePropertyAtSelectionStart:@"color"]);
    EXPECT_WK_STREQ("rgba(255, 0, 0, 0.2)", [webView stylePropertyAtSelectionStart:@"background-color"]);
    NSDictionary *attributes = [webView typingAttributes];
    EXPECT_TRUE([[NSColor colorWithRed:0 green:0 blue:1 alpha:1] isEqual:attributes[NSForegroundColorAttributeName]]);
    EXPECT_TRUE([[NSColor colorWithRed:1 green:0 blue:0 alpha:0.2] isEqual:attributes[NSBackgroundColorAttributeName]]);

    options.backgroundColor = nil;
    options.foregroundColor = nil;

    EXPECT_WK_STREQ("rgb(0, 0, 0)", [webView stylePropertyAtSelectionStart:@"color"]);
    EXPECT_WK_STREQ("rgba(0, 0, 0, 0)", [webView stylePropertyAtSelectionStart:@"background-color"]);
    attributes = [webView typingAttributes];
    EXPECT_NULL(attributes[NSForegroundColorAttributeName]);
    EXPECT_NULL(attributes[NSBackgroundColorAttributeName]);
}

TEST(FontManagerTests, SetSelectedSystemFontAfterTogglingBold)
{
    NSFontManager *fontManager = NSFontManager.sharedFontManager;

    auto webView = webViewForFontManagerTesting(NSFontManager.sharedFontManager, @"<body style='font-family: system-ui;' contenteditable>Foo</body>");
    [webView selectWord:nil];
    [webView waitForNextPresentationUpdate];
    [webView waitForNextPresentationUpdate];
    auto initialSelectedFont = retainPtr([fontManager selectedFont]);

    [webView _synchronouslyExecuteEditCommand:@"ToggleBold" argument:nil];
    [webView waitForNextPresentationUpdate];
    auto selectedFontAfterBolding = retainPtr([fontManager selectedFont]);

    [webView _synchronouslyExecuteEditCommand:@"ToggleBold" argument:nil];
    [webView waitForNextPresentationUpdate];
    auto selectedFontAfterUnbolding = retainPtr([fontManager selectedFont]);

    [webView _synchronouslyExecuteEditCommand:@"ToggleBold" argument:nil];
    [webView waitForNextPresentationUpdate];
    auto selectedFontAfterBoldingAgain = retainPtr([fontManager selectedFont]);

    EXPECT_WK_STREQ([initialSelectedFont fontName], [selectedFontAfterUnbolding fontName]);
    EXPECT_WK_STREQ([selectedFontAfterBolding fontName], [selectedFontAfterBoldingAgain fontName]);
    EXPECT_FALSE([[initialSelectedFont fontName] isEqual:[selectedFontAfterBolding fontName]]);
    EXPECT_EQ([initialSelectedFont pointSize], 16.);
    EXPECT_EQ([selectedFontAfterBolding pointSize], 16.);
    EXPECT_EQ([selectedFontAfterUnbolding pointSize], 16.);
    EXPECT_EQ([selectedFontAfterBoldingAgain pointSize], 16.);
}

} // namespace TestWebKitAPI

#endif // PLATFORM(MAC)
