/*
 * Copyright (C) 2016 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 "TestWKWebView.h"
#import <WebKit/WKWebViewConfigurationPrivate.h>
#import <WebKit/WKWebViewPrivate.h>
#import <WebKit/WKWebViewPrivateForTesting.h>
#import <wtf/RetainPtr.h>

#if PLATFORM(MAC)

@interface WKWebView (WKWebViewAdditions)

- (void)_interactWithMediaControlsForTesting;

@end

@interface VideoControlsManagerTestWebView : TestWKWebView
@end

@implementation VideoControlsManagerTestWebView {
    bool _isDoneQueryingControlledElementID;
    NSString *_controlledElementID;
}

- (void)expectControlsManager:(BOOL)expectControlsManager afterReceivingMessage:(NSString *)message
{
    __block bool doneWaiting = false;
    [self performAfterReceivingMessage:message action:^ {
        BOOL hasVideoForControlsManager = [self _hasActiveVideoForControlsManager];
        if (expectControlsManager)
            EXPECT_TRUE(hasVideoForControlsManager);
        else
            EXPECT_FALSE(hasVideoForControlsManager);
        doneWaiting = true;
    }];

    TestWebKitAPI::Util::run(&doneWaiting);
}

- (void)waitForMediaControlsToShow
{
    while (![self _hasActiveVideoForControlsManager])
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
}

- (void)waitForMediaControlsToHide
{
    while ([self _hasActiveVideoForControlsManager])
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]];
}

- (void)waitForPageToLoadWithAutoplayingVideos:(int)numberOfAutoplayingVideos
{
    __block int remainingAutoplayedCount = numberOfAutoplayingVideos;
    __block bool autoplayingIsFinished = !numberOfAutoplayingVideos;
    __block bool pageHasLoaded = false;

    [self performAfterLoading:^()
    {
        pageHasLoaded = true;
    }];

    if (numberOfAutoplayingVideos) {
        [self performAfterReceivingMessage:@"autoplayed" action:^()
        {
            remainingAutoplayedCount--;
            if (remainingAutoplayedCount <= 0)
                autoplayingIsFinished = true;
        }];
    }

    TestWebKitAPI::Util::run(&pageHasLoaded);
    TestWebKitAPI::Util::run(&autoplayingIsFinished);
}

- (NSString *)controlledElementID
{
    _isDoneQueryingControlledElementID = false;
    [self _requestControlledElementID];
    TestWebKitAPI::Util::run(&_isDoneQueryingControlledElementID);
    return _controlledElementID;
}

- (void)_handleControlledElementIDResponse:(NSString *)identifier
{
    _controlledElementID = [identifier copy];
    _isDoneQueryingControlledElementID = true;
}

@end

namespace TestWebKitAPI {

RetainPtr<VideoControlsManagerTestWebView> setUpWebViewForTestingVideoControlsManager(NSRect frame)
{
    RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
    configuration.get().mediaTypesRequiringUserActionForPlayback = WKAudiovisualMediaTypeNone;
    return adoptNS([[VideoControlsManagerTestWebView alloc] initWithFrame:frame configuration:configuration.get()]);
}

TEST(VideoControlsManager, VideoControlsManagerSingleLargeVideo)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    // A large video with audio should have a controls manager even if it is played via script like this video.
    // So the expectation is YES.
    [webView loadTestPageNamed:@"large-video-with-audio"];
    [webView waitForMediaControlsToShow];
}

TEST(VideoControlsManager, VideoControlsManagerSingleSmallVideo)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    // A small video will not have a controls manager unless it started playing because of a user gesture. Since this
    // video is started with a script, the expectation is NO.
    [webView loadTestPageNamed:@"video-with-audio"];
    [webView expectControlsManager:NO afterReceivingMessage:@"playing"];
}

TEST(VideoControlsManager, VideoControlsManagerMultipleVideosWithAudio)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    [webView loadTestPageNamed:@"large-videos-with-audio"];
    [webView waitForPageToLoadWithAutoplayingVideos:0];

    EXPECT_FALSE([webView _hasActiveVideoForControlsManager]);
}

// FIXME: Re-enable this test once <webkit.org/b/175143> is resolved.
TEST(VideoControlsManager, DISABLED_VideoControlsManagerMultipleVideosWithAudioAndAutoplay)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    [webView loadTestPageNamed:@"large-videos-with-audio-autoplay"];
    [webView waitForPageToLoadWithAutoplayingVideos:1];

    EXPECT_TRUE([webView _hasActiveVideoForControlsManager]);
    EXPECT_TRUE([[webView controlledElementID] isEqualToString:@"bar"]);
}

TEST(VideoControlsManager, VideoControlsManagerMultipleVideosScrollPausedVideoOutOfView)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 500, 500));

    [webView loadTestPageNamed:@"large-videos-paused-video-hides-controls"];
    [webView waitForPageToLoadWithAutoplayingVideos:1];

    [webView stringByEvaluatingJavaScript:@"pauseFirstVideoAndScrollToSecondVideo()"];
    [webView expectControlsManager:NO afterReceivingMessage:@"paused"];
}

TEST(VideoControlsManager, VideoControlsManagerMultipleVideosScrollPlayingVideoWithSoundOutOfView)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 500, 500));

    [webView loadTestPageNamed:@"large-videos-playing-video-keeps-controls"];
    [webView waitForPageToLoadWithAutoplayingVideos:1];

    [webView stringByEvaluatingJavaScript:@"scrollToSecondVideo()"];
    [webView expectControlsManager:YES afterReceivingMessage:@"scrolled"];
}

TEST(VideoControlsManager, VideoControlsManagerMultipleVideosScrollPlayingMutedVideoOutOfView)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 500, 500));

    [webView loadTestPageNamed:@"large-videos-playing-muted-video-hides-controls"];
    [webView waitForPageToLoadWithAutoplayingVideos:1];

    [webView stringByEvaluatingJavaScript:@"muteFirstVideoAndScrollToSecondVideo()"];
    [webView expectControlsManager:NO afterReceivingMessage:@"playing"];
}

TEST(VideoControlsManager, VideoControlsManagerMultipleVideosShowControlsForLastInteractedVideo)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 800, 600));
    NSPoint clickPoint = NSMakePoint(400, 300);

    [webView loadTestPageNamed:@"large-videos-autoplaying-click-to-pause"];
    [webView waitForPageToLoadWithAutoplayingVideos:2];

    [webView mouseDownAtPoint:clickPoint simulatePressure:YES];

    __block bool firstVideoPaused = false;
    __block bool secondVideoPaused = false;
    [webView performAfterReceivingMessage:@"paused" action:^ {
        NSString *controlledElementID = [webView controlledElementID];
        if (firstVideoPaused) {
            EXPECT_TRUE([controlledElementID isEqualToString:@"second"]);
            secondVideoPaused = true;
        } else {
            EXPECT_TRUE([controlledElementID isEqualToString:@"first"]);
            [webView mouseDownAtPoint:clickPoint simulatePressure:YES];
        }
        firstVideoPaused = true;
    }];

    TestWebKitAPI::Util::run(&secondVideoPaused);
}
// FIXME: Re-enable this test once <webkit.org/b/175909> is resolved.
TEST(VideoControlsManager, DISABLED_VideoControlsManagerMultipleVideosSwitchControlledVideoWhenScrolling)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 800, 600));

    [webView loadTestPageNamed:@"large-videos-autoplaying-scroll-to-video"];
    [webView waitForPageToLoadWithAutoplayingVideos:2];

    [webView stringByEvaluatingJavaScript:@"scrollToSecondView()"];
    [webView expectControlsManager:YES afterReceivingMessage:@"scrolled"];

    EXPECT_TRUE([[webView controlledElementID] isEqualToString:@"second"]);
}

TEST(VideoControlsManager, VideoControlsManagerMultipleVideosScrollOnlyLargeVideoOutOfView)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 500, 500));

    [webView loadTestPageNamed:@"large-video-playing-scroll-away"];
    [webView waitForPageToLoadWithAutoplayingVideos:1];
    [webView stringByEvaluatingJavaScript:@"scrollVideoOutOfView()"];
    [webView expectControlsManager:YES afterReceivingMessage:@"scrolled"];
}

TEST(VideoControlsManager, VideoControlsManagerSingleSmallAutoplayingVideo)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    [webView loadTestPageNamed:@"autoplaying-video-with-audio"];
    [webView waitForPageToLoadWithAutoplayingVideos:1];

    [webView mouseDownAtPoint:NSMakePoint(50, 50) simulatePressure:YES];
    [webView expectControlsManager:YES afterReceivingMessage:@"paused"];
}

TEST(VideoControlsManager, VideoControlsManagerLargeAutoplayingVideoSeeksAfterEnding)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    [webView loadTestPageNamed:@"large-video-seek-after-ending"];

    // Immediately after ending, the controls should still be present.
    [webView expectControlsManager:YES afterReceivingMessage:@"ended"];

    // At some point in the future, they should automatically hide.
    [webView waitForMediaControlsToHide];
}

TEST(VideoControlsManager, VideoControlsManagerLargeAutoplayingVideoSeeksAndPlaysAfterEnding)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    // Since the video is still playing, the expectation is YES even if the video has ended once.
    [webView loadTestPageNamed:@"large-video-seek-to-beginning-and-play-after-ending"];
    [webView expectControlsManager:YES afterReceivingMessage:@"replaying"];
}

TEST(VideoControlsManager, VideoControlsManagerLargeAutoplayingVideoAfterSeekingToEnd)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    [webView loadTestPageNamed:@"large-video-hides-controls-after-seek-to-end"];
    [webView waitForPageToLoadWithAutoplayingVideos:1];
    [webView mouseDownAtPoint:NSMakePoint(50, 50) simulatePressure:YES];

    // We expect there to be media controls, since this is a user gestured seek to the end.
    // This is akin to seeking to the end by scrubbing in the controls.
    [webView expectControlsManager:YES afterReceivingMessage:@"ended"];
}

TEST(VideoControlsManager, VideoControlsManagerSingleLargeVideoWithoutAudio)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    // A large video with no audio will not have a controls manager unless it started playing because of a user gesture. Since this
    // video is started with a script, the expectation is NO.
    [webView loadTestPageNamed:@"large-video-without-audio"];
    [webView expectControlsManager:NO afterReceivingMessage:@"playing"];
}

TEST(VideoControlsManager, VideoControlsManagerAudioElementStartedWithScript)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    // An audio element MUST be started with a user gesture in order to have a controls manager, so the expectation is NO.
    [webView loadTestPageNamed:@"audio-only"];
    [webView expectControlsManager:NO afterReceivingMessage:@"playing"];
}

TEST(VideoControlsManager, VideoControlsManagerAudioElementStartedByInteraction)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 400, 400));

    [webView loadTestPageNamed:@"play-audio-on-click"];
    [webView waitForPageToLoadWithAutoplayingVideos:0];
    [webView mouseDownAtPoint:NSMakePoint(200, 200) simulatePressure:YES];

    // An audio element MUST be started with a user gesture in order to have a controls manager, so the expectation is YES.
    [webView expectControlsManager:YES afterReceivingMessage:@"playing-first"];
    EXPECT_TRUE([[webView controlledElementID] isEqualToString:@"first"]);
}

TEST(VideoControlsManager, DISABLED_VideoControlsManagerAudioElementFollowingUserInteraction)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 400, 400));

    [webView loadTestPageNamed:@"play-audio-on-click"];
    [webView waitForPageToLoadWithAutoplayingVideos:0];

    [webView performAfterReceivingMessage:@"playing-first" action:^ {
        [webView evaluateJavaScript:@"seekToEnd()" completionHandler:nil];
    }];

    __block bool secondAudioPlaying = false;
    [webView performAfterReceivingMessage:@"playing-second" action:^ {
        secondAudioPlaying = true;
    }];

    [webView mouseDownAtPoint:NSMakePoint(200, 200) simulatePressure:YES];

    TestWebKitAPI::Util::run(&secondAudioPlaying);
    while ([[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantPast]]) {
        if ([webView _hasActiveVideoForControlsManager] && [[webView controlledElementID] isEqualToString:@"second"])
            break;
    }
}

TEST(VideoControlsManager, VideoControlsManagerTearsDownMediaControlsOnDealloc)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    NSURL *urlOfVideo = [[NSBundle mainBundle] URLForResource:@"video-with-audio" withExtension:@"mp4" subdirectory:@"TestWebKitAPI.resources"];
    [webView loadFileURL:urlOfVideo allowingReadAccessToURL:[urlOfVideo URLByDeletingLastPathComponent]];

    __block bool finishedTest = false;
    [webView performAfterLoading:^ {
        // Verify that we tear down the media controls properly, such that we don't crash when the web view is released.
        if ([webView respondsToSelector:@selector(_interactWithMediaControlsForTesting)])
            [webView _interactWithMediaControlsForTesting];

        finishedTest = true;
    }];

    TestWebKitAPI::Util::run(&finishedTest);
}

TEST(VideoControlsManager, VideoControlsManagerDoesNotShowMediaControlsForOffscreenVideo)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 1024, 768));

    [webView loadTestPageNamed:@"large-video-offscreen"];
    [webView waitForMediaControlsToHide];
}

TEST(VideoControlsManager, VideoControlsManagerKeepsControlsStableDuringSrcChangeOnClick)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 800, 600));

    [webView loadTestPageNamed:@"change-video-source-on-click"];
    [webView waitForPageToLoadWithAutoplayingVideos:1];
    [webView mouseDownAtPoint:NSMakePoint(400, 300) simulatePressure:YES];

    [webView expectControlsManager:YES afterReceivingMessage:@"changed"];
}

TEST(VideoControlsManager, VideoControlsManagerKeepsControlsStableDuringSrcChangeOnEnd)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 800, 600));

    [webView loadTestPageNamed:@"change-video-source-on-end"];
    [webView expectControlsManager:YES afterReceivingMessage:@"changed"];
}

TEST(VideoControlsManager, VideoControlsManagerSmallVideoInMediaDocument)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 100, 100));

    __block bool finishedLoad = false;
    [webView performAfterLoading:^ {
        finishedLoad = true;
    }];
    
    NSURL *urlOfVideo = [[NSBundle mainBundle] URLForResource:@"video-with-audio" withExtension:@"mp4" subdirectory:@"TestWebKitAPI.resources"];
    [webView loadFileURL:urlOfVideo allowingReadAccessToURL:[urlOfVideo URLByDeletingLastPathComponent]];
    
    TestWebKitAPI::Util::run(&finishedLoad);
    
    // We expect the media controller to be present because this is a media document.
    EXPECT_TRUE([webView _hasActiveVideoForControlsManager]);
}
    
TEST(VideoControlsManager, VideoControlsManagerOffscreenIframeMediaDocument)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 800, 600));
    [webView loadTestPageNamed:@"offscreen-iframe-of-media-document"];
    
    // We do not expect a controls manager becuase the media document is in an iframe.
    [webView expectControlsManager:NO afterReceivingMessage:@"loaded"];
}

TEST(VideoControlsManager, VideoControlsManagerLongSkinnyVideoInWideMainFrame)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 1600, 800));

    [webView loadTestPageNamed:@"skinny-autoplaying-video-with-audio"];
    [webView expectControlsManager:NO afterReceivingMessage:@"playing"];
}

TEST(VideoControlsManager, VideoControlsManagerWideMediumSizedVideoInWideMainFrame)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 1600, 800));

    [webView loadTestPageNamed:@"wide-autoplaying-video-with-audio"];
    [webView expectControlsManager:YES afterReceivingMessage:@"playing"];
}

TEST(VideoControlsManager, VideoControlsManagerFullSizeVideoInWideMainFrame)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 1600, 800));

    [webView loadTestPageNamed:@"full-size-autoplaying-video-with-audio"];
    [webView expectControlsManager:YES afterReceivingMessage:@"playing"];
}

TEST(VideoControlsManager, VideoControlsManagerVideoMutesOnPlaying)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 500, 500));

    [webView loadTestPageNamed:@"large-video-mutes-onplaying"];
    [webView expectControlsManager:NO afterReceivingMessage:@"playing"];
}

TEST(VideoControlsManager, VideoControlsManagerPageWithEnormousVideo)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 500, 500));

    [webView loadTestPageNamed:@"enormous-video-with-sound"];
    [webView expectControlsManager:NO afterReceivingMessage:@"playing"];
}

TEST(VideoControlsManager, VideoControlsManagerDoesNotChangeValuesExposedToJavaScript)
{
    RetainPtr<VideoControlsManagerTestWebView> webView = setUpWebViewForTestingVideoControlsManager(NSMakeRect(0, 0, 500, 500));

    // A large video with audio should have a controls manager even if it is played via script like this video.
    // So the expectation is YES.
    [webView loadTestPageNamed:@"large-video-with-audio"];
    [webView waitForMediaControlsToShow];
    [webView _updateMediaPlaybackControlsManager];

    EXPECT_EQ(1.0, [[webView objectByEvaluatingJavaScript:@"document.getElementsByTagName('video')[0].playbackRate"] doubleValue]);
    EXPECT_EQ(1.0, [[webView objectByEvaluatingJavaScript:@"document.getElementsByTagName('video')[0].defaultPlaybackRate"] doubleValue]);

    [webView objectByEvaluatingJavaScript:@"document.getElementsByTagName('video')[0].playbackRate = 2.0;"];

    EXPECT_EQ(2.0, [[webView objectByEvaluatingJavaScript:@"document.getElementsByTagName('video')[0].playbackRate"] doubleValue]);
    EXPECT_EQ(1.0, [[webView objectByEvaluatingJavaScript:@"document.getElementsByTagName('video')[0].defaultPlaybackRate"] doubleValue]);
}

} // namespace TestWebKitAPI

#endif // PLATFORM(MAC)
