/*
 * Copyright (C) 2019 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"

#if PLATFORM(IOS_FAMILY)

IGNORE_WARNINGS_BEGIN("deprecated-implementations")

#import "PlatformUtilities.h"
#import "UIKitSPI.h"
#import <wtf/RetainPtr.h>

@interface LegacyLoadingDelegate : NSObject <UIWebViewDelegate>
- (void)waitForDidFinishLoad;
@end

@implementation LegacyLoadingDelegate {
    BOOL _loadComplete;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    _loadComplete = YES;
}

- (void)waitForDidFinishLoad
{
    EXPECT_FALSE(_loadComplete);
    TestWebKitAPI::Util::run(&_loadComplete);
}

@end

TEST(WebKitLegacy, ScrollToRevealSelection)
{
    auto window = adoptNS([[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
    [window setHidden:NO];
    auto webView = adoptNS([[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
    [window addSubview:webView.get()];
    auto delegate = adoptNS([[LegacyLoadingDelegate alloc] init]);
    [webView setDelegate:delegate.get()];
    [webView loadHTMLString:@"<meta name='viewport' content='width=device-width, initial-scale=1'><body style='font-size: 100px;' contenteditable>" baseURL:nil];
    [delegate waitForDidFinishLoad];
    [webView stringByEvaluatingJavaScriptFromString:@"document.body.focus()"];
    for (int i = 0; i < 10; ++i)
        [[webView _browserView] insertText:@"\n"];

    EXPECT_GT([[webView scrollView] contentOffset].y, 0);
}

IGNORE_WARNINGS_END

#endif // PLATFORM(IOS_FAMILY)
