diff options
| author | joepeck@webkit.org <joepeck@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc> | 2013-01-28 22:38:23 +0000 |
|---|---|---|
| committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-08-08 17:34:02 +0200 |
| commit | 0dd9e57645d192fca388abe8f04e93ca7bef6ad6 (patch) | |
| tree | 580a6d97c337b8e5cd7ad71e58ee6081e01d84e8 | |
| parent | f0ce121cf5367b340160408821ab6b9d00d3d0cb (diff) | |
| download | qtwebkit-0dd9e57645d192fca388abe8f04e93ca7bef6ad6.tar.gz | |
Improve PageVisibility API with enums
https://bugs.webkit.org/show_bug.cgi?id=107364
Reviewed by Sam Weinig.
Source/WebKit/mac:
* WebView/WebView.mm:
* WebView/WebViewPrivate.h:
(corePageVisibilityState):
(-[WebView _setVisibilityState:isInitialState:]):
Switch the private API form int to a WebPageVisibilityState enum.
Source/WebKit2:
* Shared/API/c/WKPageVisibilityTypes.h: Added.
* Shared/API/c/WKSharedAPICast.h:
(WebKit::toPageVisibilityState):
Create an enum for page visibility APIs and a conversion function
for the WK2 values to WebCore values.
* Target.pri:
* GNUmakefile.list.am:
* WebKit2.xcodeproj/project.pbxproj:
Add WKPageVisibilityTypes.h to the build as a private export.
* UIProcess/API/C/WKPage.h:
* UIProcess/API/C/WKPage.cpp:
(WKPageSetVisibilityState):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::setVisibilityState):
UIProcess API to set visibility state. WebPageProxy already
had m_visibilityState, so update that when setter is used.
* WebProcess/InjectedBundle/API/c/WKBundle.cpp:
* WebProcess/InjectedBundle/API/c/WKBundlePrivate.h:
* WebProcess/InjectedBundle/InjectedBundle.cpp:
* WebProcess/InjectedBundle/InjectedBundle.h:
Remove the old SPI for WebKitTestRunner. Tests now use the C API.
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::setVisibilityState):
* WebProcess/WebPage/WebPage.messages.in:
Update the existing WebPage API to use uint32_t, which matches
other enum message types.
Tools:
* DumpRenderTree/mac/TestRunnerMac.mm:
(TestRunner::resetPageVisibility):
(TestRunner::setPageVisibility):
Update the WK1 test code to use the new WK1 enums.
* WebKitTestRunner/InjectedBundle/InjectedBundle.cpp:
(WTR::InjectedBundle::setVisibilityState):
* WebKitTestRunner/InjectedBundle/InjectedBundle.h:
(InjectedBundle):
* WebKitTestRunner/InjectedBundle/TestRunner.cpp:
(WTR::TestRunner::setPageVisibility):
(WTR::TestRunner::resetPageVisibility):
* WebKitTestRunner/TestController.cpp:
(WTR::TestController::setVisibilityState):
* WebKitTestRunner/TestController.h:
(TestController):
* WebKitTestRunner/TestInvocation.cpp:
(WTR::TestInvocation::didReceiveMessageFromInjectedBundle):
Update the WK2 test code to use the new WK2 API and enums.
* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKit2/PageVisibilityState.cpp: Added.
(TestWebKitAPI):
(TestWebKitAPI::setPageVisibilityStateWithEvalContinuation):
(TestWebKitAPI::assertSerializedScriptValueIsStringValue):
(TestWebKitAPI::didRunStep1StateChangeVisibleToHidden):
(TestWebKitAPI::didRunStep2StateChangeHiddenToPrerender):
(TestWebKitAPI::didRunStep3StateChangePrerenderToPreview):
(TestWebKitAPI::didRunStep4InStatePreview):
(TestWebKitAPI::TEST):
Test the new WK2 API with all enum types.
Change-Id: I0a057111d7ef26cb87ade328291d4f94322480b7
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@141010 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@digia.com>
27 files changed, 302 insertions, 47 deletions
diff --git a/Source/WebKit/mac/WebView/WebView.mm b/Source/WebKit/mac/WebView/WebView.mm index f8e5b79f0..d270eaed3 100644 --- a/Source/WebKit/mac/WebView/WebView.mm +++ b/Source/WebKit/mac/WebView/WebView.mm @@ -408,6 +408,23 @@ WebLayoutMilestones kitLayoutMilestones(LayoutMilestones milestones) | (milestones & DidHitRelevantRepaintedObjectsAreaThreshold ? WebDidHitRelevantRepaintedObjectsAreaThreshold : 0); } +static PageVisibilityState core(WebPageVisibilityState visibilityState) +{ + switch (visibilityState) { + case WebPageVisibilityStateVisible: + return PageVisibilityStateVisible; + case WebPageVisibilityStateHidden: + return PageVisibilityStateHidden; + case WebPageVisibilityStatePrerender: + return PageVisibilityStatePrerender; + case WebPageVisibilityStatePreview: + return PageVisibilityStatePreview; + } + + ASSERT_NOT_REACHED(); + return PageVisibilityStateVisible; +} + @interface WebView (WebFileInternal) - (float)_deviceScaleFactor; - (BOOL)_isLoading; @@ -2937,6 +2954,14 @@ static Vector<String> toStringVector(NSArray* patterns) return kitLayoutMilestones(page->layoutMilestones()); } +- (void)_setVisibilityState:(WebPageVisibilityState)visibilityState isInitialState:(BOOL)isInitialState +{ +#if ENABLE(PAGE_VISIBILITY_API) || ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING) + if (_private->page) + _private->page->setVisibilityState(core(visibilityState), isInitialState); +#endif +} + - (void)_setPaginationBehavesLikeColumns:(BOOL)behavesLikeColumns { Page* page = core(self); @@ -3065,15 +3090,6 @@ static Vector<String> toStringVector(NSArray* patterns) ResourceRequest::setHTTPPipeliningEnabled(enabled); } -- (void)_setVisibilityState:(int)visibilityState isInitialState:(BOOL)isInitialState -{ -#if ENABLE(PAGE_VISIBILITY_API) || ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING) - if (_private->page) { - _private->page->setVisibilityState(static_cast<PageVisibilityState>(visibilityState), isInitialState); - } -#endif -} - @end @implementation _WebSafeForwarder diff --git a/Source/WebKit/mac/WebView/WebViewPrivate.h b/Source/WebKit/mac/WebView/WebViewPrivate.h index fd5b9b06d..49bdcd0cb 100644 --- a/Source/WebKit/mac/WebView/WebViewPrivate.h +++ b/Source/WebKit/mac/WebView/WebViewPrivate.h @@ -115,7 +115,13 @@ enum { }; typedef NSUInteger WebLayoutMilestones; -// This needs to be in sync with WebCore::NotificationClient::Permission +typedef enum { + WebPageVisibilityStateVisible, + WebPageVisibilityStateHidden, + WebPageVisibilityStatePrerender, + WebPageVisibilityStatePreview +} WebPageVisibilityState; + typedef enum { WebNotificationPermissionAllowed, WebNotificationPermissionNotAllowed, @@ -574,6 +580,8 @@ Could be worth adding to the API. - (void)_listenForLayoutMilestones:(WebLayoutMilestones)layoutMilestones; - (WebLayoutMilestones)_layoutMilestones; +- (void)_setVisibilityState:(WebPageVisibilityState)visibilityState isInitialState:(BOOL)isInitialState; + // Whether the column-break-{before,after} properties are respected instead of the // page-break-{before,after} properties. - (void)_setPaginationBehavesLikeColumns:(BOOL)behavesLikeColumns; diff --git a/Source/WebKit2/GNUmakefile.list.am b/Source/WebKit2/GNUmakefile.list.am index ab523ef3f..84d231489 100644 --- a/Source/WebKit2/GNUmakefile.list.am +++ b/Source/WebKit2/GNUmakefile.list.am @@ -20,6 +20,7 @@ webkit2_h_api += \ $(WebKit2)/Shared/API/c/WKMutableDictionary.h \ $(WebKit2)/Shared/API/c/WKNumber.h \ $(WebKit2)/Shared/API/c/WKPageLoadTypes.h \ + $(WebKit2)/Shared/API/c/WKPageVisibilityTypes.h \ $(WebKit2)/Shared/API/c/WKRenderLayer.h \ $(WebKit2)/Shared/API/c/WKRenderObject.h \ $(WebKit2)/Shared/API/c/WKSecurityOrigin.h \ @@ -338,6 +339,7 @@ webkit2_sources += \ Source/WebKit2/Shared/API/c/WKNumber.cpp \ Source/WebKit2/Shared/API/c/WKNumber.h \ Source/WebKit2/Shared/API/c/WKPageLoadTypes.h \ + Source/WebKit2/Shared/API/c/WKPageVisibilityTypes.h \ Source/WebKit2/Shared/API/c/WKRenderLayer.cpp \ Source/WebKit2/Shared/API/c/WKRenderLayer.h \ Source/WebKit2/Shared/API/c/WKRenderObject.cpp \ diff --git a/Source/WebKit2/Shared/API/c/WKPageVisibilityTypes.h b/Source/WebKit2/Shared/API/c/WKPageVisibilityTypes.h new file mode 100644 index 000000000..8bc4cedd7 --- /dev/null +++ b/Source/WebKit2/Shared/API/c/WKPageVisibilityTypes.h @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2013 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. + */ + +#ifndef WKPageVisibilityTypes_h +#define WKPageVisibilityTypes_h + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + kWKPageVisibilityStateVisible, + kWKPageVisibilityStateHidden, + kWKPageVisibilityStatePrerender, + kWKPageVisibilityStatePreview +}; +typedef uint32_t WKPageVisibilityState; + +#ifdef __cplusplus +} +#endif + +#endif /* WKPageVisibilityTypes_h */ diff --git a/Source/WebKit2/Shared/API/c/WKSharedAPICast.h b/Source/WebKit2/Shared/API/c/WKSharedAPICast.h index 380cd25c2..f7b40b67b 100644 --- a/Source/WebKit2/Shared/API/c/WKSharedAPICast.h +++ b/Source/WebKit2/Shared/API/c/WKSharedAPICast.h @@ -35,6 +35,7 @@ #include "WKGeometry.h" #include "WKImage.h" #include "WKPageLoadTypes.h" +#include "WKPageVisibilityTypes.h" #include "WebError.h" #include "WebEvent.h" #include "WebFindOptions.h" @@ -49,6 +50,7 @@ #include <WebCore/FrameLoaderTypes.h> #include <WebCore/IntRect.h> #include <WebCore/LayoutMilestones.h> +#include <WebCore/PageVisibilityState.h> #include <WebCore/SecurityOrigin.h> #include <WebCore/UserContentTypes.h> #include <WebCore/UserScriptTypes.h> @@ -788,6 +790,23 @@ inline WebCore::LayoutMilestones toLayoutMilestones(WKLayoutMilestones wkMilesto return milestones; } +inline WebCore::PageVisibilityState toPageVisibilityState(WKPageVisibilityState wkPageVisibilityState) +{ + switch (wkPageVisibilityState) { + case kWKPageVisibilityStateVisible: + return WebCore::PageVisibilityStateVisible; + case kWKPageVisibilityStateHidden: + return WebCore::PageVisibilityStateHidden; + case kWKPageVisibilityStatePrerender: + return WebCore::PageVisibilityStatePrerender; + case kWKPageVisibilityStatePreview: + return WebCore::PageVisibilityStatePreview; + } + + ASSERT_NOT_REACHED(); + return WebCore::PageVisibilityStateVisible; +} + inline ImageOptions toImageOptions(WKImageOptions wkImageOptions) { unsigned imageOptions = 0; diff --git a/Source/WebKit2/Target.pri b/Source/WebKit2/Target.pri index aeefadee7..e47264199 100644 --- a/Source/WebKit2/Target.pri +++ b/Source/WebKit2/Target.pri @@ -56,6 +56,7 @@ HEADERS += \ Shared/API/c/WKMutableDictionary.h \ Shared/API/c/WKNumber.h \ Shared/API/c/WKPageLoadTypes.h \ + Shared/API/c/WKPageVisibilityTypes.h \ Shared/API/c/WKRenderLayer.h \ Shared/API/c/WKRenderObject.h \ Shared/API/c/WKSecurityOrigin.h \ diff --git a/Source/WebKit2/UIProcess/API/C/WKPage.cpp b/Source/WebKit2/UIProcess/API/C/WKPage.cpp index ef871bb4c..c0e17c429 100644 --- a/Source/WebKit2/UIProcess/API/C/WKPage.cpp +++ b/Source/WebKit2/UIProcess/API/C/WKPage.cpp @@ -347,6 +347,11 @@ void WKPageListenForLayoutMilestones(WKPageRef pageRef, WKLayoutMilestones miles toImpl(pageRef)->listenForLayoutMilestones(toLayoutMilestones(milestones)); } +void WKPageSetVisibilityState(WKPageRef pageRef, WKPageVisibilityState state, bool isInitialState) +{ + toImpl(pageRef)->setVisibilityState(toPageVisibilityState(state), isInitialState); +} + bool WKPageHasHorizontalScrollbar(WKPageRef pageRef) { return toImpl(pageRef)->hasHorizontalScrollbar(); diff --git a/Source/WebKit2/UIProcess/API/C/WKPage.h b/Source/WebKit2/UIProcess/API/C/WKPage.h index 4a25bb63b..b002eef0f 100644 --- a/Source/WebKit2/UIProcess/API/C/WKPage.h +++ b/Source/WebKit2/UIProcess/API/C/WKPage.h @@ -33,6 +33,7 @@ #include <WebKit2/WKGeometry.h> #include <WebKit2/WKNativeEvent.h> #include <WebKit2/WKPageLoadTypes.h> +#include <WebKit2/WKPageVisibilityTypes.h> #ifndef __cplusplus #include <stdbool.h> @@ -431,6 +432,8 @@ WK_EXPORT WKSize WKPageFixedLayoutSize(WKPageRef page); WK_EXPORT void WKPageListenForLayoutMilestones(WKPageRef page, WKLayoutMilestones milestones); +WK_EXPORT void WKPageSetVisibilityState(WKPageRef page, WKPageVisibilityState state, bool isInitialState); + WK_EXPORT bool WKPageHasHorizontalScrollbar(WKPageRef page); WK_EXPORT bool WKPageHasVerticalScrollbar(WKPageRef page); diff --git a/Source/WebKit2/UIProcess/WebPageProxy.cpp b/Source/WebKit2/UIProcess/WebPageProxy.cpp index 9d914cf28..819fd7ad3 100644 --- a/Source/WebKit2/UIProcess/WebPageProxy.cpp +++ b/Source/WebKit2/UIProcess/WebPageProxy.cpp @@ -1588,6 +1588,19 @@ void WebPageProxy::listenForLayoutMilestones(WebCore::LayoutMilestones milestone m_process->send(Messages::WebPage::ListenForLayoutMilestones(milestones), m_pageID); } +void WebPageProxy::setVisibilityState(WebCore::PageVisibilityState visibilityState, bool isInitialState) +{ + if (!isValid()) + return; + +#if ENABLE(PAGE_VISIBILITY_API) + if (visibilityState != m_visibilityState || isInitialState) { + m_visibilityState = visibilityState; + m_process->send(Messages::WebPage::SetVisibilityState(visibilityState, isInitialState), m_pageID); + } +#endif +} + void WebPageProxy::setSuppressScrollbarAnimations(bool suppressAnimations) { if (!isValid()) diff --git a/Source/WebKit2/UIProcess/WebPageProxy.h b/Source/WebKit2/UIProcess/WebPageProxy.h index 1b2e9a2b7..b97cdf35e 100644 --- a/Source/WebKit2/UIProcess/WebPageProxy.h +++ b/Source/WebKit2/UIProcess/WebPageProxy.h @@ -508,6 +508,8 @@ public: void listenForLayoutMilestones(WebCore::LayoutMilestones); + void setVisibilityState(WebCore::PageVisibilityState, bool isInitialState); + bool hasHorizontalScrollbar() const { return m_mainFrameHasHorizontalScrollbar; } bool hasVerticalScrollbar() const { return m_mainFrameHasVerticalScrollbar; } diff --git a/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj b/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj index f5893bff4..75550a429 100644 --- a/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj +++ b/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj @@ -571,6 +571,7 @@ 9F4F59461648BA8E00493B7E /* NetworkProcessManagerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9F4F59451648BA8E00493B7E /* NetworkProcessManagerMac.mm */; }; 9F54F88F16488E87007DF81A /* ChildProcessMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9F54F88E16488E87007DF81A /* ChildProcessMac.mm */; }; 9F54F8951648AE0F007DF81A /* PluginProcessManagerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9F54F8941648AE0E007DF81A /* PluginProcessManagerMac.mm */; }; + A5EFD38C16B0E88C00B2F0E8 /* WKPageVisibilityTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A5EFD38B16B0E88C00B2F0E8 /* WKPageVisibilityTypes.h */; settings = {ATTRIBUTES = (Private, ); }; }; B62E7310143047A60069EC35 /* WKHitTestResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B62E730F143047A60069EC35 /* WKHitTestResult.cpp */; }; B62E7312143047B00069EC35 /* WKHitTestResult.h in Headers */ = {isa = PBXBuildFile; fileRef = B62E7311143047B00069EC35 /* WKHitTestResult.h */; settings = {ATTRIBUTES = (Private, ); }; }; B63403F914910D57001070B5 /* APIObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B63403F814910D57001070B5 /* APIObject.cpp */; }; @@ -1829,6 +1830,7 @@ 9F4F59451648BA8E00493B7E /* NetworkProcessManagerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = NetworkProcessManagerMac.mm; path = mac/NetworkProcessManagerMac.mm; sourceTree = "<group>"; }; 9F54F88E16488E87007DF81A /* ChildProcessMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ChildProcessMac.mm; sourceTree = "<group>"; }; 9F54F8941648AE0E007DF81A /* PluginProcessManagerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PluginProcessManagerMac.mm; sourceTree = "<group>"; }; + A5EFD38B16B0E88C00B2F0E8 /* WKPageVisibilityTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKPageVisibilityTypes.h; sourceTree = "<group>"; }; A72D5D7F1236CBA800A88B15 /* WebSerializedScriptValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSerializedScriptValue.h; sourceTree = "<group>"; }; B396EA5512E0ED2D00F4FEB7 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; }; B62E730F143047A60069EC35 /* WKHitTestResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKHitTestResult.cpp; sourceTree = "<group>"; }; @@ -4199,6 +4201,7 @@ BC4075E5124FF0270068F20A /* WKNumber.cpp */, BC4075E6124FF0270068F20A /* WKNumber.h */, BC2D021812AC426C00E732A3 /* WKPageLoadTypes.h */, + A5EFD38B16B0E88C00B2F0E8 /* WKPageVisibilityTypes.h */, 37948406150C4B9600E52CE9 /* WKRenderLayer.cpp */, 37948407150C4B9600E52CE9 /* WKRenderLayer.h */, 37608820150414F700FC82C7 /* WKRenderObject.cpp */, @@ -5016,6 +5019,7 @@ 5175944B1657080400DD771D /* NetworkResourceLoaderMessages.h in Headers */, BC8ACA1316670D89004C1941 /* ObjCObjectGraph.h in Headers */, BC8ACA1516670D89004C1941 /* ObjCObjectGraphCoders.h in Headers */, + A5EFD38C16B0E88C00B2F0E8 /* WKPageVisibilityTypes.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp b/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp index e7d5611f0..627d748ec 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp +++ b/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp @@ -293,11 +293,6 @@ bool WKBundleIsProcessingUserGesture(WKBundleRef) return InjectedBundle::isProcessingUserGesture(); } -void WKBundleSetPageVisibilityState(WKBundleRef bundleRef, WKBundlePageRef pageRef, int state, bool isInitialState) -{ - toImpl(bundleRef)->setPageVisibilityState(toImpl(pageRef), state, isInitialState); -} - size_t WKBundleGetWorkerThreadCount(WKBundleRef) { // Actually do not need argument here, keeping it however for consistency. diff --git a/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePrivate.h b/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePrivate.h index 2cacb5976..f46dcc866 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePrivate.h +++ b/Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundlePrivate.h @@ -97,8 +97,6 @@ WK_EXPORT size_t WKBundleGetJavaScriptObjectsCount(WKBundleRef bundle); WK_EXPORT bool WKBundleIsProcessingUserGesture(WKBundleRef bundle); -WK_EXPORT void WKBundleSetPageVisibilityState(WKBundleRef bundle, WKBundlePageRef page, int state, bool isInitialState); - WK_EXPORT size_t WKBundleGetWorkerThreadCount(WKBundleRef bundle); WK_EXPORT void WKBundleSetTabKeyCyclesThroughElements(WKBundleRef bundle, WKBundlePageRef page, bool enabled); diff --git a/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp b/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp index 1b4e85af7..07ccab7e3 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp +++ b/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.cpp @@ -58,7 +58,6 @@ #include <WebCore/JSNotification.h> #include <WebCore/Page.h> #include <WebCore/PageGroup.h> -#include <WebCore/PageVisibilityState.h> #include <WebCore/PrintContext.h> #include <WebCore/ResourceHandle.h> #include <WebCore/ResourceLoadScheduler.h> @@ -567,13 +566,6 @@ void InjectedBundle::didReceiveMessageToPage(WebPage* page, const String& messag m_client.didReceiveMessageToPage(this, page, messageName, messageBody); } -void InjectedBundle::setPageVisibilityState(WebPage* page, int state, bool isInitialState) -{ -#if ENABLE(PAGE_VISIBILITY_API) || ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING) - page->corePage()->setVisibilityState(static_cast<PageVisibilityState>(state), isInitialState); -#endif -} - size_t InjectedBundle::workerThreadCount() { #if ENABLE(WORKERS) diff --git a/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.h b/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.h index 8c065cc14..982473889 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.h +++ b/Source/WebKit2/WebProcess/InjectedBundle/InjectedBundle.h @@ -173,8 +173,6 @@ public: static bool isProcessingUserGesture(); - void setPageVisibilityState(WebPage*, int state, bool isInitialState); - static size_t workerThreadCount(); void setTabKeyCyclesThroughElements(WebPage*, bool enabled); diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.cpp b/Source/WebKit2/WebProcess/WebPage/WebPage.cpp index 849c1c1e9..bbabefb72 100644 --- a/Source/WebKit2/WebProcess/WebPage/WebPage.cpp +++ b/Source/WebKit2/WebProcess/WebPage/WebPage.cpp @@ -3519,7 +3519,7 @@ FrameView* WebPage::mainFrameView() const } #if ENABLE(PAGE_VISIBILITY_API) || ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING) -void WebPage::setVisibilityState(int visibilityState, bool isInitialState) +void WebPage::setVisibilityState(uint32_t visibilityState, bool isInitialState) { if (!m_page) return; diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.h b/Source/WebKit2/WebProcess/WebPage/WebPage.h index d4817c028..5d7dafff8 100644 --- a/Source/WebKit2/WebProcess/WebPage/WebPage.h +++ b/Source/WebKit2/WebProcess/WebPage/WebPage.h @@ -55,9 +55,8 @@ #include <WebCore/Editor.h> #include <WebCore/FrameLoaderTypes.h> #include <WebCore/IntRect.h> -#if ENABLE(PAGE_VISIBILITY_API) +#include <WebCore/Page.h> #include <WebCore/PageVisibilityState.h> -#endif #include <WebCore/PlatformScreen.h> #include <WebCore/ScrollTypes.h> #include <WebCore/WebCoreKeyboardUIMode.h> @@ -580,7 +579,7 @@ public: bool willGoToBackForwardItemCallbackEnabled() const { return m_willGoToBackForwardItemCallbackEnabled; } #if ENABLE(PAGE_VISIBILITY_API) || ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING) - void setVisibilityState(int visibilityState, bool isInitialState); + void setVisibilityState(uint32_t /* WebCore::PageVisibilityState */, bool isInitialState); #endif #if PLATFORM(GTK) && USE(TEXTURE_MAPPER_GL) diff --git a/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in b/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in index ad4292b4b..057435ec3 100644 --- a/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in +++ b/Source/WebKit2/WebProcess/WebPage/WebPage.messages.in @@ -307,7 +307,7 @@ messages -> WebPage { #endif #if ENABLE(PAGE_VISIBILITY_API) || ENABLE(HIDDEN_PAGE_DOM_TIMER_THROTTLING) - SetVisibilityState(int visibilityState, bool isInitialState) + SetVisibilityState(uint32_t visibilityState, bool isInitialState) #endif #if PLATFORM(GTK) && USE(TEXTURE_MAPPER_GL) diff --git a/Tools/DumpRenderTree/mac/TestRunnerMac.mm b/Tools/DumpRenderTree/mac/TestRunnerMac.mm index b520e096f..c6a2f4a37 100644 --- a/Tools/DumpRenderTree/mac/TestRunnerMac.mm +++ b/Tools/DumpRenderTree/mac/TestRunnerMac.mm @@ -43,7 +43,6 @@ #import <JavaScriptCore/JSStringRef.h> #import <JavaScriptCore/JSStringRefCF.h> #import <WebCore/GeolocationPosition.h> -#import <WebCore/PageVisibilityState.h> #import <WebKit/DOMDocument.h> #import <WebKit/DOMElement.h> #import <WebKit/WebApplicationCache.h> @@ -1156,9 +1155,8 @@ void TestRunner::setBackingScaleFactor(double backingScaleFactor) void TestRunner::resetPageVisibility() { WebView *webView = [mainFrame webView]; - if ([webView respondsToSelector:@selector(_setVisibilityState:isInitialState:)]) { - [webView _setVisibilityState:WebCore::PageVisibilityStateVisible isInitialState:NO]; - } + if ([webView respondsToSelector:@selector(_setVisibilityState:isInitialState:)]) + [webView _setVisibilityState:WebPageVisibilityStateVisible isInitialState:YES]; } void TestRunner::setPageVisibility(const char* newVisibility) @@ -1168,13 +1166,13 @@ void TestRunner::setPageVisibility(const char* newVisibility) WebView *webView = [mainFrame webView]; if (!strcmp(newVisibility, "visible")) - [webView _setVisibilityState:WebCore::PageVisibilityStateVisible isInitialState:NO]; + [webView _setVisibilityState:WebPageVisibilityStateVisible isInitialState:NO]; else if (!strcmp(newVisibility, "hidden")) - [webView _setVisibilityState:WebCore::PageVisibilityStateHidden isInitialState:NO]; + [webView _setVisibilityState:WebPageVisibilityStateHidden isInitialState:NO]; else if (!strcmp(newVisibility, "prerender")) - [webView _setVisibilityState:WebCore::PageVisibilityStatePrerender isInitialState:NO]; + [webView _setVisibilityState:WebPageVisibilityStatePrerender isInitialState:NO]; else if (!strcmp(newVisibility, "preview")) - [webView _setVisibilityState:WebCore::PageVisibilityStatePreview isInitialState:NO]; + [webView _setVisibilityState:WebPageVisibilityStatePreview isInitialState:NO]; } void TestRunner::sendWebIntentResponse(JSStringRef) diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj index 249fc4aa6..cfda4b91d 100644 --- a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj +++ b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj @@ -95,6 +95,7 @@ 9B26FCCA159D16DE00CC3765 /* HTMLFormCollectionNamedItem.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9B26FCB4159D15E700CC3765 /* HTMLFormCollectionNamedItem.html */; }; 9B4F8FA4159D52B1002D9F94 /* HTMLCollectionNamedItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9B4F8FA3159D52B1002D9F94 /* HTMLCollectionNamedItem.mm */; }; 9B4F8FA7159D52DD002D9F94 /* HTMLCollectionNamedItem.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9B4F8FA6159D52CA002D9F94 /* HTMLCollectionNamedItem.html */; }; + A51B650916ADF9B1007AA5D9 /* PageVisibilityState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A51B650816ADF9B1007AA5D9 /* PageVisibilityState.cpp */; }; A5E2027315B2181900C13E14 /* WindowlessWebViewWithMedia.mm in Sources */ = {isa = PBXBuildFile; fileRef = A5E2027215B2181900C13E14 /* WindowlessWebViewWithMedia.mm */; }; A5E2027515B21F6E00C13E14 /* WindowlessWebViewWithMedia.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = A5E2027015B2180600C13E14 /* WindowlessWebViewWithMedia.html */; }; A7A966DB140ECCC8005EF9B4 /* CheckedArithmeticOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7A966DA140ECCC8005EF9B4 /* CheckedArithmeticOperations.cpp */; }; @@ -341,6 +342,7 @@ 9B26FCB4159D15E700CC3765 /* HTMLFormCollectionNamedItem.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = HTMLFormCollectionNamedItem.html; sourceTree = "<group>"; }; 9B4F8FA3159D52B1002D9F94 /* HTMLCollectionNamedItem.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = HTMLCollectionNamedItem.mm; sourceTree = "<group>"; }; 9B4F8FA6159D52CA002D9F94 /* HTMLCollectionNamedItem.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = HTMLCollectionNamedItem.html; sourceTree = "<group>"; }; + A51B650816ADF9B1007AA5D9 /* PageVisibilityState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PageVisibilityState.cpp; sourceTree = "<group>"; }; A5E2027015B2180600C13E14 /* WindowlessWebViewWithMedia.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = WindowlessWebViewWithMedia.html; sourceTree = "<group>"; }; A5E2027215B2181900C13E14 /* WindowlessWebViewWithMedia.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WindowlessWebViewWithMedia.mm; sourceTree = "<group>"; }; A7A966DA140ECCC8005EF9B4 /* CheckedArithmeticOperations.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CheckedArithmeticOperations.cpp; path = WTF/CheckedArithmeticOperations.cpp; sourceTree = "<group>"; }; @@ -624,6 +626,7 @@ 93F7E86E14DC8E5B00C84A99 /* NewFirstVisuallyNonEmptyLayoutFrames_Bundle.cpp */, BC909779125571AB00083756 /* PageLoadBasic.cpp */, BC2D004812A9FDFA00E732A3 /* PageLoadDidChangeLocationWithinPageForFrame.cpp */, + A51B650816ADF9B1007AA5D9 /* PageVisibilityState.cpp */, 52E5CE4514D21E9D003B2BD8 /* ParentFrame.cpp */, 52E5CE4814D21EAB003B2BD8 /* ParentFrame_Bundle.cpp */, 333B9CE11277F23100FEFCE3 /* PreventEmptyUserAgent.cpp */, @@ -973,6 +976,7 @@ 93F7E86C14DC8E4D00C84A99 /* NewFirstVisuallyNonEmptyLayoutFrames.cpp in Sources */, BC90977A125571AB00083756 /* PageLoadBasic.cpp in Sources */, BC2D004912A9FDFA00E732A3 /* PageLoadDidChangeLocationWithinPageForFrame.cpp in Sources */, + A51B650916ADF9B1007AA5D9 /* PageVisibilityState.cpp in Sources */, 52E5CE4614D21E9D003B2BD8 /* ParentFrame.cpp in Sources */, BC575BC0126F5752006F0F12 /* PlatformUtilities.cpp in Sources */, BC131885117114B600B69727 /* PlatformUtilitiesMac.mm in Sources */, diff --git a/Tools/TestWebKitAPI/Tests/WebKit2/PageVisibilityState.cpp b/Tools/TestWebKitAPI/Tests/WebKit2/PageVisibilityState.cpp new file mode 100644 index 000000000..00c79ce3a --- /dev/null +++ b/Tools/TestWebKitAPI/Tests/WebKit2/PageVisibilityState.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2013 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. + */ + +#include "config.h" +#include "PlatformUtilities.h" +#include "PlatformWebView.h" +#include "Test.h" +#include <JavaScriptCore/JSContextRef.h> +#include <WebKit2/WKRetainPtr.h> +#include <WebKit2/WKSerializedScriptValue.h> + +namespace TestWebKitAPI { + +static bool testDone; + +static void didRunStep1StateChangeVisibleToHidden(WKSerializedScriptValueRef, WKErrorRef, void*); +static void didRunStep2StateChangeHiddenToPrerender(WKSerializedScriptValueRef, WKErrorRef, void*); +static void didRunStep3StateChangePrerenderToPreview(WKSerializedScriptValueRef, WKErrorRef, void*); +static void didRunStep4InStatePreview(WKSerializedScriptValueRef, WKErrorRef, void*); + +static void setPageVisibilityStateWithEvalContinuation(PlatformWebView* webView, WKPageVisibilityState visibilityState, WKPageRunJavaScriptFunction callback) +{ + WKPageSetVisibilityState(webView->page(), visibilityState, false); + WKRetainPtr<WKStringRef> javaScriptString(AdoptWK, WKStringCreateWithUTF8CString("document.webkitVisibilityState")); + WKPageRunJavaScriptInMainFrame(webView->page(), javaScriptString.get(), static_cast<void*>(webView), callback); +} + +static void assertSerializedScriptValueIsStringValue(WKSerializedScriptValueRef serializedValue, WKErrorRef error, const char *expected) +{ + EXPECT_NULL(error); + EXPECT_NOT_NULL(serializedValue); + if (error || !serializedValue) + return; + + JSGlobalContextRef scriptContext = JSGlobalContextCreate(0); + JSValueRef scriptValue = WKSerializedScriptValueDeserialize(serializedValue, scriptContext, 0); + EXPECT_TRUE(JSValueIsString(scriptContext, scriptValue)); + if (!JSValueIsString(scriptContext, scriptValue)) { + JSGlobalContextRelease(scriptContext); + return; + } + + JSStringRef expectedString = JSStringCreateWithUTF8CString(expected); + JSStringRef scriptString = JSValueToStringCopy(scriptContext, scriptValue, 0); + EXPECT_TRUE(JSStringIsEqual(scriptString, expectedString)); + + JSStringRelease(scriptString); + JSStringRelease(expectedString); + JSGlobalContextRelease(scriptContext); +} + +static void didRunStep1StateChangeVisibleToHidden(WKSerializedScriptValueRef resultSerializedScriptValue, WKErrorRef error, void* context) +{ + assertSerializedScriptValueIsStringValue(resultSerializedScriptValue, error, "visible"); + setPageVisibilityStateWithEvalContinuation(static_cast<PlatformWebView*>(context), kWKPageVisibilityStateHidden, didRunStep2StateChangeHiddenToPrerender); +} + +static void didRunStep2StateChangeHiddenToPrerender(WKSerializedScriptValueRef resultSerializedScriptValue, WKErrorRef error, void* context) +{ + assertSerializedScriptValueIsStringValue(resultSerializedScriptValue, error, "hidden"); + setPageVisibilityStateWithEvalContinuation(static_cast<PlatformWebView*>(context), kWKPageVisibilityStatePrerender, didRunStep3StateChangePrerenderToPreview); +} + +static void didRunStep3StateChangePrerenderToPreview(WKSerializedScriptValueRef resultSerializedScriptValue, WKErrorRef error, void* context) +{ + assertSerializedScriptValueIsStringValue(resultSerializedScriptValue, error, "prerender"); + setPageVisibilityStateWithEvalContinuation(static_cast<PlatformWebView*>(context), kWKPageVisibilityStatePreview, didRunStep4InStatePreview); +} + +static void didRunStep4InStatePreview(WKSerializedScriptValueRef resultSerializedScriptValue, WKErrorRef error, void* context) +{ + assertSerializedScriptValueIsStringValue(resultSerializedScriptValue, error, "preview"); + testDone = true; +} + +TEST(WebKit2, PageVisibilityState) +{ + WKRetainPtr<WKContextRef> context(AdoptWK, WKContextCreate()); + + // Pass the PlatformWebView webView on as the context of the evals, so we can continue to eval on it. + PlatformWebView webView(context.get()); + setPageVisibilityStateWithEvalContinuation(&webView, kWKPageVisibilityStateVisible, didRunStep1StateChangeVisibleToHidden); + + Util::run(&testDone); +} + +} // namespace TestWebKitAPI diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp index fa7939d3e..96b3d657b 100644 --- a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp +++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp @@ -458,6 +458,22 @@ void InjectedBundle::setCustomPolicyDelegate(bool enabled, bool permissive) WKBundlePostMessage(m_bundle, messageName.get(), messageBody.get()); } +void InjectedBundle::setVisibilityState(WKPageVisibilityState visibilityState, bool isInitialState) +{ + WKRetainPtr<WKStringRef> messageName(AdoptWK, WKStringCreateWithUTF8CString("SetVisibilityState")); + WKRetainPtr<WKMutableDictionaryRef> messageBody(AdoptWK, WKMutableDictionaryCreate()); + + WKRetainPtr<WKStringRef> visibilityStateKeyWK(AdoptWK, WKStringCreateWithUTF8CString("visibilityState")); + WKRetainPtr<WKUInt64Ref> visibilityStateWK(AdoptWK, WKUInt64Create(visibilityState)); + WKDictionaryAddItem(messageBody.get(), visibilityStateKeyWK.get(), visibilityStateWK.get()); + + WKRetainPtr<WKStringRef> isInitialKeyWK(AdoptWK, WKStringCreateWithUTF8CString("isInitialState")); + WKRetainPtr<WKBooleanRef> isInitialWK(AdoptWK, WKBooleanCreate(isInitialState)); + WKDictionaryAddItem(messageBody.get(), isInitialKeyWK.get(), isInitialWK.get()); + + WKBundlePostMessage(m_bundle, messageName.get(), messageBody.get()); +} + bool InjectedBundle::shouldProcessWorkQueue() const { if (!m_useWorkQueue) diff --git a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h index 41469ec79..527641e40 100644 --- a/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h +++ b/Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h @@ -98,6 +98,9 @@ public: // Policy delegate. void setCustomPolicyDelegate(bool enabled, bool permissive); + // Page Visibility. + void setVisibilityState(WKPageVisibilityState, bool isInitialState); + // Work queue. bool shouldProcessWorkQueue() const; void processWorkQueue(); diff --git a/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp b/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp index 10fccc23e..602e600f0 100644 --- a/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp +++ b/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp @@ -32,12 +32,13 @@ #include "PlatformWebView.h" #include "StringFunctions.h" #include "TestController.h" -#include <WebCore/PageVisibilityState.h> +#include <WebKit2/WKBundle.h> #include <WebKit2/WKBundleBackForwardList.h> #include <WebKit2/WKBundleFrame.h> #include <WebKit2/WKBundleFramePrivate.h> #include <WebKit2/WKBundleInspector.h> #include <WebKit2/WKBundleNodeHandlePrivate.h> +#include <WebKit2/WKBundlePage.h> #include <WebKit2/WKBundlePagePrivate.h> #include <WebKit2/WKBundlePrivate.h> #include <WebKit2/WKBundleScriptWorld.h> @@ -539,21 +540,21 @@ void TestRunner::setDefersLoading(bool shouldDeferLoading) void TestRunner::setPageVisibility(JSStringRef state) { - WebCore::PageVisibilityState visibilityState = WebCore::PageVisibilityStateVisible; + WKPageVisibilityState visibilityState = kWKPageVisibilityStateVisible; if (JSStringIsEqualToUTF8CString(state, "hidden")) - visibilityState = WebCore::PageVisibilityStateHidden; + visibilityState = kWKPageVisibilityStateHidden; else if (JSStringIsEqualToUTF8CString(state, "prerender")) - visibilityState = WebCore::PageVisibilityStatePrerender; + visibilityState = kWKPageVisibilityStatePrerender; else if (JSStringIsEqualToUTF8CString(state, "preview")) - visibilityState = WebCore::PageVisibilityStatePreview; + visibilityState = kWKPageVisibilityStatePreview; - WKBundleSetPageVisibilityState(InjectedBundle::shared().bundle(), InjectedBundle::shared().page()->page(), visibilityState, /* isInitialState */ false); + InjectedBundle::shared().setVisibilityState(visibilityState, false); } void TestRunner::resetPageVisibility() { - WKBundleSetPageVisibilityState(InjectedBundle::shared().bundle(), InjectedBundle::shared().page()->page(), WebCore::PageVisibilityStateVisible, /* isInitialState */ true); + InjectedBundle::shared().setVisibilityState(kWKPageVisibilityStateVisible, true); } typedef WTF::HashMap<unsigned, JSValueRef> CallbackMap; diff --git a/Tools/WebKitTestRunner/TestController.cpp b/Tools/WebKitTestRunner/TestController.cpp index 0e47f3c24..006892f4f 100644 --- a/Tools/WebKitTestRunner/TestController.cpp +++ b/Tools/WebKitTestRunner/TestController.cpp @@ -1077,6 +1077,11 @@ void TestController::setCustomPolicyDelegate(bool enabled, bool permissive) m_policyDelegatePermissive = permissive; } +void TestController::setVisibilityState(WKPageVisibilityState visibilityState, bool isInitialState) +{ + WKPageSetVisibilityState(m_mainWebView->page(), visibilityState, isInitialState); +} + void TestController::decidePolicyForGeolocationPermissionRequestIfPossible() { if (!m_isGeolocationPermissionSet) diff --git a/Tools/WebKitTestRunner/TestController.h b/Tools/WebKitTestRunner/TestController.h index 332e33b70..b0ad979e0 100644 --- a/Tools/WebKitTestRunner/TestController.h +++ b/Tools/WebKitTestRunner/TestController.h @@ -79,6 +79,9 @@ public: // Policy delegate. void setCustomPolicyDelegate(bool enabled, bool permissive); + // Page Visibility. + void setVisibilityState(WKPageVisibilityState, bool isInitialState); + bool resetStateToConsistentValues(); WorkQueueManager& workQueueManager() { return m_workQueueManager; } diff --git a/Tools/WebKitTestRunner/TestInvocation.cpp b/Tools/WebKitTestRunner/TestInvocation.cpp index 8f66cc0dd..f6ad9aa45 100644 --- a/Tools/WebKitTestRunner/TestInvocation.cpp +++ b/Tools/WebKitTestRunner/TestInvocation.cpp @@ -478,6 +478,22 @@ void TestInvocation::didReceiveMessageFromInjectedBundle(WKStringRef messageName return; } + if (WKStringIsEqualToUTF8CString(messageName, "SetVisibilityState")) { + ASSERT(WKGetTypeID(messageBody) == WKDictionaryGetTypeID()); + WKDictionaryRef messageBodyDictionary = static_cast<WKDictionaryRef>(messageBody); + + WKRetainPtr<WKStringRef> visibilityStateKeyWK(AdoptWK, WKStringCreateWithUTF8CString("visibilityState")); + WKUInt64Ref visibilityStateWK = static_cast<WKUInt64Ref>(WKDictionaryGetItemForKey(messageBodyDictionary, visibilityStateKeyWK.get())); + WKPageVisibilityState visibilityState = static_cast<WKPageVisibilityState>(WKUInt64GetValue(visibilityStateWK)); + + WKRetainPtr<WKStringRef> isInitialKeyWK(AdoptWK, WKStringCreateWithUTF8CString("isInitialState")); + WKBooleanRef isInitialWK = static_cast<WKBooleanRef>(WKDictionaryGetItemForKey(messageBodyDictionary, isInitialKeyWK.get())); + bool isInitialState = WKBooleanGetValue(isInitialWK); + + TestController::shared().setVisibilityState(visibilityState, isInitialState); + return; + } + if (WKStringIsEqualToUTF8CString(messageName, "ProcessWorkQueue")) { if (TestController::shared().workQueueManager().processWorkQueue()) { WKRetainPtr<WKStringRef> messageName = adoptWK(WKStringCreateWithUTF8CString("WorkQueueProcessedCallback")); |
