/*
 * 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 "ParserYieldTokenTests.h"

#import "PlatformUtilities.h"
#import "TestURLSchemeHandler.h"
#import "TestWKWebView.h"
#import "WKWebViewConfigurationExtras.h"
#import <WebKit/WKWebViewPrivate.h>
#import <WebKit/_WKRemoteObjectInterface.h>
#import <WebKit/_WKRemoteObjectRegistry.h>
#import <wtf/BlockPtr.h>
#import <wtf/Seconds.h>
#import <wtf/darwin/DispatchExtras.h>

@interface ParserYieldTokenTestWebView : TestWKWebView <ParserYieldTokenTestRunner>
@property (nonatomic, readonly) BOOL finishedDocumentLoad;
@property (nonatomic, readonly) BOOL finishedLoad;
@end

@implementation ParserYieldTokenTestWebView {
    RetainPtr<id <ParserYieldTokenTestBundle>> _bundle;
    RetainPtr<TestURLSchemeHandler> _schemeHandler;
}

+ (RetainPtr<ParserYieldTokenTestWebView>)webView
{
    auto schemeHandler = adoptNS([[TestURLSchemeHandler alloc] init]);
    auto *configuration = [WKWebViewConfiguration _test_configurationWithTestPlugInClassName:@"ParserYieldTokenPlugIn"];
    [configuration setURLSchemeHandler:schemeHandler.get() forURLScheme:@"custom"];
    auto webView = adoptNS([[ParserYieldTokenTestWebView alloc] initWithFrame:CGRectMake(0, 0, 200, 200) configuration:configuration]);
    [[webView _remoteObjectRegistry] registerExportedObject:webView.get() interface:[_WKRemoteObjectInterface remoteObjectInterfaceWithProtocol:@protocol(ParserYieldTokenTestRunner)]];
    webView->_bundle = [[webView _remoteObjectRegistry] remoteObjectProxyWithInterface:[_WKRemoteObjectInterface remoteObjectInterfaceWithProtocol:@protocol(ParserYieldTokenTestBundle)]];
    webView->_schemeHandler = WTF::move(schemeHandler);
    return webView;
}

- (id <ParserYieldTokenTestBundle>)bundle
{
    return _bundle.get();
}

- (TestURLSchemeHandler *)schemeHandler
{
    return _schemeHandler.get();
}

- (void)didFinishDocumentLoad
{
    _finishedDocumentLoad = YES;
}

- (void)didFinishLoad
{
    _finishedLoad = YES;
}

@end

static void waitForDelay(Seconds delay)
{
    __block bool done = false;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delay.nanoseconds()), mainDispatchQueueSingleton(), ^{
        done = true;
    });
    TestWebKitAPI::Util::run(&done);
}

TEST(ParserYieldTokenTests, PreventDocumentLoadByTakingParserYieldToken)
{
    auto webView = [ParserYieldTokenTestWebView webView];
    [[webView bundle] takeDocumentParserTokenAfterCommittingLoad];
    [webView loadTestPageNamed:@"simple"];

    // Give the web view a chance to load the page. In the case where the token fails to yield document parsing, it's very likely that
    // the document will finish loading, and we'll fail the test expectations below. In the unlikely event where page load may take
    // longer than 1 second, this test should still pass.
    waitForDelay(1_s);
    EXPECT_FALSE([webView finishedDocumentLoad]);
    EXPECT_FALSE([webView finishedLoad]);

    // Now, allow document parsing to continue, and wait for the page to finish loading.
    [[webView bundle] releaseDocumentParserToken];

    while (![webView finishedLoad] || ![webView finishedDocumentLoad])
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
}

TEST(ParserYieldTokenTests, TakeMultipleParserYieldTokens)
{
    auto webView = [ParserYieldTokenTestWebView webView];
    [[webView bundle] takeDocumentParserTokenAfterCommittingLoad];
    [webView loadTestPageNamed:@"simple"];

    waitForDelay(0.5_s);
    EXPECT_FALSE([webView finishedDocumentLoad]);
    EXPECT_FALSE([webView finishedLoad]);

    [[webView bundle] takeDocumentParserTokenAfterCommittingLoad];
    [[webView bundle] releaseDocumentParserToken];

    waitForDelay(0.5_s);
    EXPECT_FALSE([webView finishedDocumentLoad]);
    EXPECT_FALSE([webView finishedLoad]);

    [[webView bundle] releaseDocumentParserToken];

    while (![webView finishedLoad] || ![webView finishedDocumentLoad])
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
}

TEST(ParserYieldTokenTests, DeferredScriptExecutesBeforeDocumentLoadWhenTakingParserYieldToken)
{
    auto webView = [ParserYieldTokenTestWebView webView];

    [[webView bundle] takeDocumentParserTokenAfterCommittingLoad];
    [webView loadTestPageNamed:@"text-with-deferred-script"];

    waitForDelay(0.5_s);
    EXPECT_FALSE([webView finishedDocumentLoad]);
    EXPECT_FALSE([webView finishedLoad]);

    [[webView bundle] releaseDocumentParserToken];

    while (![webView finishedLoad] || ![webView finishedDocumentLoad])
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];

    // Verify that synchronous script is executed before deferred script and deferred script is run before document load.
    NSArray<NSString *> *eventMessages = [webView objectByEvaluatingJavaScript:@"window.eventMessages"];
    EXPECT_EQ(eventMessages.count, 8U);
    EXPECT_WK_STREQ("Running sync", eventMessages[0]);
    EXPECT_WK_STREQ("Loaded script: sync", eventMessages[1]);
    EXPECT_WK_STREQ("Running defer-before", eventMessages[2]);
    EXPECT_WK_STREQ("Loaded script: defer-before", eventMessages[3]);
    EXPECT_WK_STREQ("Running defer-after", eventMessages[4]);
    EXPECT_WK_STREQ("Loaded script: defer-after", eventMessages[5]);
    EXPECT_WK_STREQ("Document finished loading", eventMessages[6]);
    EXPECT_WK_STREQ("Finished loading", eventMessages[7]);
}

TEST(ParserYieldTokenTests, AsyncScriptRunsWhenFetched)
{
    auto webView = [ParserYieldTokenTestWebView webView];
    [webView schemeHandler].startURLSchemeTaskHandler = [] (WKWebView *, id <WKURLSchemeTask> task) {
        auto script = retainPtr(@"window.eventMessages.push('Running async script.');");
        auto response = adoptNS([[NSURLResponse alloc] initWithURL:task.request.URL MIMEType:@"text/javascript" expectedContentLength:[script length] textEncodingName:nil]);
        dispatch_async(mainDispatchQueueSingleton(), [task = retainPtr(task), response = WTF::move(response), script = WTF::move(script)] {
            [task didReceiveResponse:response.get()];
            [task didReceiveData:[script dataUsingEncoding:NSUTF8StringEncoding]];
            [task didFinish];
        });
    };

    [[webView bundle] takeDocumentParserTokenAfterCommittingLoad];

    NSURL *pageURL = [NSBundle.test_resourcesBundle URLForResource:@"text-with-async-script" withExtension:@"html"];
    [webView loadHTMLString:[NSString stringWithContentsOfURL:pageURL encoding:NSUTF8StringEncoding error:nil] baseURL:[NSURL URLWithString:@"custom://"]];

    waitForDelay(0.5_s);
    EXPECT_FALSE([webView finishedDocumentLoad]);
    EXPECT_FALSE([webView finishedLoad]);

    [[webView bundle] releaseDocumentParserToken];

    while (![webView finishedLoad] || ![webView finishedDocumentLoad])
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];

    NSArray<NSString *> *eventMessages = [webView objectByEvaluatingJavaScript:@"window.eventMessages"];
    EXPECT_EQ(eventMessages.count, 4U);
    EXPECT_WK_STREQ("Before requesting async script.", eventMessages[0]);
    EXPECT_WK_STREQ("After requesting async script.", eventMessages[1]);
    if ([eventMessages[2] isEqualToString:@"Running async script."])
        EXPECT_WK_STREQ("Finished requesting async script.", eventMessages[3]);
    else {
        EXPECT_WK_STREQ("Finished requesting async script.", eventMessages[2]);
        EXPECT_WK_STREQ("Running async script.", eventMessages[3]);
    }

}
