/*
 * Copyright (C) 2021 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 "PlatformUtilities.h"
#import "Test.h"
#import "TestNavigationDelegate.h"
#import "TestWKWebView.h"
#import <WebKit/WKFoundation.h>
#import <WebKit/WKWebView.h>
#import <wtf/RetainPtr.h>
#import <wtf/Vector.h>
#import <wtf/cocoa/NSURLExtras.h>

static NSString *exampleURLString = @"https://example.com/";
static NSURL *exampleURL = [NSURL URLWithString:exampleURLString];
static NSString *htmlString = @"<html><body><h1>Hello, world!</h1></body></html>";
static NSString *exampleURLString2 = @"https://example.org/";
static NSURL *exampleURL2 = [NSURL URLWithString:exampleURLString2];
static NSString *htmlString2 = @"<html><body><h1>Hello, new world!</h1></body></html>";

TEST(WKWebView, LoadSimulatedRequestUsingResponseHTMLString)
{
    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);

    auto delegate = adoptNS([[TestNavigationDelegate alloc] init]);
    [webView setNavigationDelegate:delegate.get()];

    NSURLRequest *loadRequest = [NSURLRequest requestWithURL:exampleURL];

    [webView loadSimulatedRequest:loadRequest responseHTMLString:htmlString];
    [delegate waitForDidFinishNavigation];

ALLOW_DEPRECATED_DECLARATIONS_BEGIN
    // FIXME(223658): Remove this once adopters have moved to the final API.
    [webView loadSimulatedRequest:loadRequest withResponseHTMLString:htmlString];
ALLOW_DEPRECATED_DECLARATIONS_END
    [delegate waitForDidFinishNavigation];
}

TEST(WKWebView, LoadSimulatedRequestUsingResponseData)
{
    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);

    auto delegate = adoptNS([[TestNavigationDelegate alloc] init]);
    [webView setNavigationDelegate:delegate.get()];

    NSURLRequest *loadRequest = [NSURLRequest requestWithURL:exampleURL];

    NSData *data = [htmlString dataUsingEncoding:NSUTF8StringEncoding];
    auto response = adoptNS([[NSURLResponse alloc] initWithURL:exampleURL MIMEType:@"text/HTML" expectedContentLength:[data length] textEncodingName:@"UTF-8"]);

    [webView loadSimulatedRequest:loadRequest response:response.get() responseData:data];
    [delegate waitForDidFinishNavigation];

ALLOW_DEPRECATED_DECLARATIONS_BEGIN
    // FIXME(223658): Remove this once adopters have moved to the final API.
    [webView loadSimulatedRequest:loadRequest withResponse:response.get() responseData:data];
ALLOW_DEPRECATED_DECLARATIONS_END
    [delegate waitForDidFinishNavigation];
}

TEST(WKWebView, LoadSimulatedRequestDelegateCallbacks)
{
    enum class Callback : uint8_t {
        NavigationAction,
        NavigationResponse,
        StartProvisional,
        Commit,
        Finish
    };

    auto checkCallbacks = [] (const Vector<Callback> vector) {
        ASSERT_EQ(vector.size(), 4u);
        EXPECT_EQ(vector[0], Callback::NavigationAction);
        EXPECT_EQ(vector[1], Callback::StartProvisional);
        EXPECT_EQ(vector[2], Callback::Commit);
        EXPECT_EQ(vector[3], Callback::Finish);
    };

    __block Vector<Callback> callbacks;
    __block bool finished = false;
    auto delegate = adoptNS([TestNavigationDelegate new]);
    delegate.get().decidePolicyForNavigationAction = ^(WKNavigationAction *, void (^completionHandler)(WKNavigationActionPolicy)) {
        callbacks.append(Callback::NavigationAction);
        completionHandler(WKNavigationActionPolicyAllow);
    };
    delegate.get().decidePolicyForNavigationResponse = ^(WKNavigationResponse *, void (^completionHandler)(WKNavigationResponsePolicy)) {
        callbacks.append(Callback::NavigationResponse);
        completionHandler(WKNavigationResponsePolicyAllow);
    };
    delegate.get().didStartProvisionalNavigation = ^(WKWebView *, WKNavigation *) {
        callbacks.append(Callback::StartProvisional);
    };
    delegate.get().didCommitNavigation = ^(WKWebView *, WKNavigation *) {
        callbacks.append(Callback::Commit);
    };
    delegate.get().didFinishNavigation = ^(WKWebView *, WKNavigation *) {
        callbacks.append(Callback::Finish);
        finished = true;
    };

    auto webView = adoptNS([WKWebView new]);
    webView.get().navigationDelegate = delegate.get();
    NSURL *url = [NSURL URLWithString:@"https://webkit.org/"];
    [webView loadHTMLString:@"hi!" baseURL:url];
    TestWebKitAPI::Util::run(&finished);

    checkCallbacks(callbacks);
    callbacks = { };
    finished = false;

    [webView loadSimulatedRequest:[NSURLRequest requestWithURL:url] response:adoptNS([[NSURLResponse alloc] initWithURL:url MIMEType:@"text/html" expectedContentLength:3 textEncodingName:nil]).get() responseData:[NSData dataWithBytes:"hi!" length:3]];
    TestWebKitAPI::Util::run(&finished);
    checkCallbacks(callbacks);
}

TEST(WKWebView, LoadFileRequest)
{
    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);

    auto delegate = adoptNS([[TestNavigationDelegate alloc] init]);
    [webView setNavigationDelegate:delegate.get()];

    NSURL *file = [NSBundle.test_resourcesBundle URLForResource:@"simple" withExtension:@"html"];
    NSURLRequest *request = [NSURLRequest requestWithURL:file];
    [webView loadFileRequest:request allowingReadAccessToURL:file.URLByDeletingLastPathComponent];
    [delegate waitForDidFinishNavigation];
    EXPECT_WK_STREQ(webView.get()._resourceDirectoryURL.path, file.URLByDeletingLastPathComponent.path);
}

TEST(WKWebView, LoadSimulatedRequestUpdatesBackForwardList)
{
    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);

    auto delegate = adoptNS([[TestNavigationDelegate alloc] init]);
    [webView setNavigationDelegate:delegate.get()];

    NSURLRequest *loadRequest = [NSURLRequest requestWithURL:exampleURL];
    [webView loadSimulatedRequest:loadRequest responseHTMLString:htmlString];
    [delegate waitForDidFinishNavigation];

    NSURLRequest *loadRequest2 = [NSURLRequest requestWithURL:exampleURL2];
    [webView loadSimulatedRequest:loadRequest2 responseHTMLString:htmlString2];
    [delegate waitForDidFinishNavigation];
    
    WKBackForwardList *list = [webView backForwardList];
    EXPECT_WK_STREQ(exampleURLString2, [list.currentItem.URL absoluteString]);
    EXPECT_EQ((NSUInteger)1, list.backList.count);
    EXPECT_EQ((NSUInteger)0, list.forwardList.count);
    EXPECT_TRUE(!list.forwardItem);
    EXPECT_WK_STREQ(exampleURLString, [list.backItem.URL absoluteString]);
    
    EXPECT_TRUE([webView canGoBack]);
    if (![webView canGoBack])
        return;

    [webView goBack];
    [delegate waitForDidFinishNavigation];

    EXPECT_WK_STREQ(exampleURLString, [list.currentItem.URL absoluteString]);
    EXPECT_EQ((NSUInteger)0, list.backList.count);
    EXPECT_EQ((NSUInteger)1, list.forwardList.count);
    EXPECT_TRUE(!list.backItem);
    EXPECT_WK_STREQ(exampleURLString2, [list.forwardItem.URL absoluteString]);

    EXPECT_TRUE([webView canGoForward]);
    if (![webView canGoForward])
        return;

    [webView goForward];
    [delegate waitForDidFinishNavigation];

    EXPECT_WK_STREQ(exampleURLString2, [list.currentItem.URL absoluteString]);
    EXPECT_EQ((NSUInteger)1, list.backList.count);
    EXPECT_EQ((NSUInteger)0, list.forwardList.count);
    EXPECT_TRUE(!list.forwardItem);
    EXPECT_WK_STREQ(exampleURLString, [list.backItem.URL absoluteString]);
    
    // loadHTMLString is peculiarly different than loadSimulatedRequest, but we need to leave it
    // like it is until we decide to change it, probably with a linked-on-or-after check.
    auto webView2 = adoptNS([WKWebView new]);
    [webView2 setNavigationDelegate:delegate.get()];
    [webView2 loadHTMLString:htmlString baseURL:loadRequest.URL];
    [delegate waitForDidFinishNavigation];
    [webView2 loadHTMLString:htmlString2 baseURL:loadRequest2.URL];
    [delegate waitForDidFinishNavigation];
    EXPECT_FALSE([webView2 canGoBack]);
    WKBackForwardList *list2 = [webView2 backForwardList];
    EXPECT_WK_STREQ("", [list2.currentItem.URL absoluteString]);
    EXPECT_EQ(0u, list2.backList.count);
    EXPECT_EQ(0u, list2.forwardList.count);
}
