/*
 * Copyright (C) 2026 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.
 */
#pragma once

#if PLATFORM (IOS_FAMILY)
@class SetShouldKeepScreenAwakeDelegate;
#endif // PLATFORM (IOS_FAMILY)

@class TestNavigationDelegate;
@class TestWKWebView;
@protocol WKUIDelegatePrivate;

struct ScreenWakeLockTestsConfig {
    enum class CrossSite : bool { No, Yes };
    CrossSite crossSite;
};

class ScreenWakeLockTests : public testing::TestWithParam<ScreenWakeLockTestsConfig> {
public:
    void SetUp() final;
    void requestLock();
    void releaseLock();
    void killWebPage();
    void closeWebPage();
    void closeTab();
    void lockShouldBeReleased();
    void lockShouldNotBeReleased();

private:
    void setUpCrossSite();
    void setUpSameSite();
    WKFrameInfo* frameOfConcern();

    RetainPtr<TestWKWebView> m_webView;
    RetainPtr<TestNavigationDelegate> m_navigationDelegate;
#if PLATFORM (IOS_FAMILY)
    RetainPtr<SetShouldKeepScreenAwakeDelegate> m_uiDelegate;
#endif // PLATFORM (IOS_FAMILY)
};

