blob: 3aa553188cf076732763d4892814e99059d139a6 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "modules/wake_lock/ScreenWakeLock.h"
#include "core/dom/DOMImplementation.h"
#include "core/dom/Document.h"
#include "core/dom/DocumentInit.h"
#include "core/frame/LocalDOMWindow.h"
#include "platform/heap/Handle.h"
#include "platform/testing/URLTestHelpers.h"
#include "public/platform/Platform.h"
#include "public/platform/WebPageVisibilityState.h"
#include "public/platform/WebUnitTestSupport.h"
#include "public/platform/modules/wake_lock/WebWakeLockClient.h"
#include "web/WebLocalFrameImpl.h"
#include "web/tests/FrameTestHelpers.h"
#include <gtest/gtest.h>
namespace {
using blink::ScreenWakeLock;
using blink::WebWakeLockClient;
class TestWebWakeLockClient: public WebWakeLockClient {
public:
TestWebWakeLockClient(): m_keepScreenAwake(false) { }
void requestKeepScreenAwake(bool keepScreenAwake) override
{
m_keepScreenAwake = keepScreenAwake;
}
bool keepScreenAwake() const { return m_keepScreenAwake; }
private:
bool m_keepScreenAwake;
};
class TestWebFrameClient: public blink::FrameTestHelpers::TestWebFrameClient {
public:
WebWakeLockClient* wakeLockClient() override
{
return &m_testWebWakeLockClient;
}
const TestWebWakeLockClient& testWebWakeLockClient() const
{
return m_testWebWakeLockClient;
}
private:
TestWebWakeLockClient m_testWebWakeLockClient;
};
class ScreenWakeLockTest: public testing::Test {
protected:
void SetUp() override
{
m_webViewHelper.initialize(true, &m_testWebFrameClient);
blink::URLTestHelpers::registerMockedURLFromBaseURL(
blink::WebString::fromUTF8("http://example.com/"),
blink::WebString::fromUTF8("foo.html"));
loadFrame();
}
void TearDown() override
{
blink::Platform::current()->unitTestSupport()->unregisterAllMockedURLs();
}
void loadFrame()
{
blink::FrameTestHelpers::loadFrame(
m_webViewHelper.webView()->mainFrame(),
"http://example.com/foo.html");
m_webViewHelper.webViewImpl()->updateAllLifecyclePhases();
}
blink::LocalFrame* frame()
{
ASSERT(m_webViewHelper.webViewImpl());
ASSERT(m_webViewHelper.webViewImpl()->mainFrameImpl());
return m_webViewHelper.webViewImpl()->mainFrameImpl()->frame();
}
blink::Screen* screen()
{
ASSERT(frame());
ASSERT(frame()->localDOMWindow());
return frame()->localDOMWindow()->screen();
}
bool screenKeepAwake()
{
ASSERT(screen());
return ScreenWakeLock::keepAwake(*screen());
}
bool clientKeepScreenAwake()
{
return m_testWebFrameClient.testWebWakeLockClient().keepScreenAwake();
}
void setKeepAwake(bool keepAwake)
{
ASSERT(screen());
ScreenWakeLock::setKeepAwake(*screen(), keepAwake);
}
void show()
{
ASSERT(m_webViewHelper.webView());
m_webViewHelper.webView()->setVisibilityState(
blink::WebPageVisibilityStateVisible, false);
}
void hide()
{
ASSERT(m_webViewHelper.webView());
m_webViewHelper.webView()->setVisibilityState(
blink::WebPageVisibilityStateHidden, false);
}
// Order of these members is important as we need to make sure that
// m_testWebFrameClient outlives m_webViewHelper (destruction order)
TestWebFrameClient m_testWebFrameClient;
blink::FrameTestHelpers::WebViewHelper m_webViewHelper;
};
TEST_F(ScreenWakeLockTest, setAndReset)
{
ASSERT_FALSE(screenKeepAwake());
ASSERT_FALSE(clientKeepScreenAwake());
setKeepAwake(true);
EXPECT_TRUE(screenKeepAwake());
EXPECT_TRUE(clientKeepScreenAwake());
setKeepAwake(false);
EXPECT_FALSE(screenKeepAwake());
EXPECT_FALSE(clientKeepScreenAwake());
}
TEST_F(ScreenWakeLockTest, hideWhenSet)
{
ASSERT_FALSE(screenKeepAwake());
ASSERT_FALSE(clientKeepScreenAwake());
setKeepAwake(true);
hide();
EXPECT_TRUE(screenKeepAwake());
EXPECT_FALSE(clientKeepScreenAwake());
}
TEST_F(ScreenWakeLockTest, setWhenHidden)
{
ASSERT_FALSE(screenKeepAwake());
ASSERT_FALSE(clientKeepScreenAwake());
hide();
setKeepAwake(true);
EXPECT_TRUE(screenKeepAwake());
EXPECT_FALSE(clientKeepScreenAwake());
}
TEST_F(ScreenWakeLockTest, showWhenSet)
{
ASSERT_FALSE(screenKeepAwake());
ASSERT_FALSE(clientKeepScreenAwake());
hide();
setKeepAwake(true);
show();
EXPECT_TRUE(screenKeepAwake());
EXPECT_TRUE(clientKeepScreenAwake());
}
TEST_F(ScreenWakeLockTest, navigate)
{
ASSERT_FALSE(screenKeepAwake());
ASSERT_FALSE(clientKeepScreenAwake());
setKeepAwake(true);
loadFrame();
EXPECT_FALSE(screenKeepAwake());
EXPECT_FALSE(clientKeepScreenAwake());
}
} // namespace