|  | // 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 "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 "testing/gtest/include/gtest/gtest.h" | 
|  | #include "web/WebLocalFrameImpl.h" | 
|  | #include "web/tests/FrameTestHelpers.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 |