Diff
Modified: trunk/Source/WebKit2/ChangeLog (216790 => 216791)
--- trunk/Source/WebKit2/ChangeLog 2017-05-12 20:43:02 UTC (rev 216790)
+++ trunk/Source/WebKit2/ChangeLog 2017-05-12 20:49:26 UTC (rev 216791)
@@ -1,3 +1,21 @@
+2017-05-12 Jeremy Jones <jere...@apple.com>
+
+ Add UIClient callback for when picture-in-picture is activated.
+ https://bugs.webkit.org/show_bug.cgi?id=172023
+
+ Reviewed by Simon Fraser.
+
+ Add WKUIPageClientV10 with setHasVideoInPictureInPicture.
+
+ * UIProcess/API/APIUIClient.h:
+ (API::UIClient::setHasVideoInPictureInPicture):
+ * UIProcess/API/C/WKPage.cpp:
+ (WKPageSetPageUIClient):
+ * UIProcess/API/C/WKPageUIClient.h:
+ * UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm:
+ (WebKit::WebVideoFullscreenManagerProxy::setupFullscreenWithID):
+ (WebKit::WebVideoFullscreenManagerProxy::fullscreenModeChanged):
+
2017-05-12 Brent Fulgham <bfulg...@apple.com>
REGRESSION(r213564): Flash audio playback failures
Modified: trunk/Source/WebKit2/UIProcess/API/APIUIClient.h (216790 => 216791)
--- trunk/Source/WebKit2/UIProcess/API/APIUIClient.h 2017-05-12 20:43:02 UTC (rev 216790)
+++ trunk/Source/WebKit2/UIProcess/API/APIUIClient.h 2017-05-12 20:49:26 UTC (rev 216791)
@@ -79,6 +79,7 @@
virtual void fullscreenMayReturnToInline(WebKit::WebPageProxy*) { }
virtual void didEnterFullscreen(WebKit::WebPageProxy*) { }
virtual void didExitFullscreen(WebKit::WebPageProxy*) { }
+ virtual void setHasVideoInPictureInPicture(WebKit::WebPageProxy*, bool) { }
virtual void close(WebKit::WebPageProxy*) { }
virtual void takeFocus(WebKit::WebPageProxy*, WKFocusDirection) { }
Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp (216790 => 216791)
--- trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp 2017-05-12 20:43:02 UTC (rev 216790)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp 2017-05-12 20:49:26 UTC (rev 216791)
@@ -110,7 +110,7 @@
};
template<> struct ClientTraits<WKPageUIClientBase> {
- typedef std::tuple<WKPageUIClientV0, WKPageUIClientV1, WKPageUIClientV2, WKPageUIClientV3, WKPageUIClientV4, WKPageUIClientV5, WKPageUIClientV6, WKPageUIClientV7, WKPageUIClientV8, WKPageUIClientV9> Versions;
+ typedef std::tuple<WKPageUIClientV0, WKPageUIClientV1, WKPageUIClientV2, WKPageUIClientV3, WKPageUIClientV4, WKPageUIClientV5, WKPageUIClientV6, WKPageUIClientV7, WKPageUIClientV8, WKPageUIClientV9, WKPageUIClientV10> Versions;
};
#if ENABLE(CONTEXT_MENUS)
@@ -1768,6 +1768,14 @@
m_client.fullscreenMayReturnToInline(toAPI(page), m_client.base.clientInfo);
}
+
+ void setHasVideoInPictureInPicture(WebPageProxy* page, bool hasVideoInPictureInPicture) override
+ {
+ if (!m_client.setHasVideoInPictureInPicture)
+ return;
+
+ m_client.setHasVideoInPictureInPicture(toAPI(page), hasVideoInPictureInPicture, m_client.base.clientInfo);
+ }
void close(WebPageProxy* page) override
{
Modified: trunk/Source/WebKit2/UIProcess/API/C/WKPageUIClient.h (216790 => 216791)
--- trunk/Source/WebKit2/UIProcess/API/C/WKPageUIClient.h 2017-05-12 20:43:02 UTC (rev 216790)
+++ trunk/Source/WebKit2/UIProcess/API/C/WKPageUIClient.h 2017-05-12 20:49:26 UTC (rev 216791)
@@ -119,10 +119,10 @@
typedef void (*WKPageMediaSessionMetadataDidChangeCallback)(WKPageRef page, WKMediaSessionMetadataRef metadata, const void* clientInfo);
typedef void (*WKHandleAutoplayEventCallback)(WKPageRef page, WKAutoplayEvent event, WKAutoplayEventFlags flags, const void* clientInfo);
typedef void (*WKFullscreenMayReturnToInlineCallback)(WKPageRef page, const void* clientInfo);
-
typedef void (*WKRequestPointerLockCallback)(WKPageRef page, const void* clientInfo);
typedef void (*WKDidLosePointerLockCallback)(WKPageRef page, const void* clientInfo);
-
+typedef void (*WKSetHasVideoInPictureInPictureCallback)(WKPageRef page, bool hasVideoInPictureInPicture, const void* clientInfo);
+
// Deprecated
typedef WKPageRef (*WKPageCreateNewPageCallback_deprecatedForUseWithV0)(WKPageRef page, WKDictionaryRef features, WKEventModifiers modifiers, WKEventMouseButton mouseButton, const void *clientInfo);
typedef void (*WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0)(WKPageRef page, WKEventModifiers modifiers, WKTypeRef userData, const void *clientInfo);
@@ -834,6 +834,100 @@
WKHandleAutoplayEventCallback handleAutoplayEvent;
} WKPageUIClientV9;
+typedef struct WKPageUIClientV10 {
+ WKPageUIClientBase base;
+
+ // Version 0.
+ WKPageCreateNewPageCallback_deprecatedForUseWithV0 createNewPage_deprecatedForUseWithV0;
+ WKPageUIClientCallback showPage;
+ WKPageUIClientCallback close;
+ WKPageTakeFocusCallback takeFocus;
+ WKPageFocusCallback focus;
+ WKPageUnfocusCallback unfocus;
+ WKPageRunJavaScriptAlertCallback_deprecatedForUseWithV0 runJavaScriptAlert_deprecatedForUseWithV0;
+ WKPageRunJavaScriptConfirmCallback_deprecatedForUseWithV0 runJavaScriptConfirm_deprecatedForUseWithV0;
+ WKPageRunJavaScriptPromptCallback_deprecatedForUseWithV0 runJavaScriptPrompt_deprecatedForUseWithV0;
+ WKPageSetStatusTextCallback setStatusText;
+ WKPageMouseDidMoveOverElementCallback_deprecatedForUseWithV0 mouseDidMoveOverElement_deprecatedForUseWithV0;
+ WKPageMissingPluginButtonClickedCallback_deprecatedForUseWithV0 missingPluginButtonClicked_deprecatedForUseWithV0;
+ WKPageDidNotHandleKeyEventCallback didNotHandleKeyEvent;
+ WKPageDidNotHandleWheelEventCallback didNotHandleWheelEvent;
+ WKPageGetToolbarsAreVisibleCallback toolbarsAreVisible;
+ WKPageSetToolbarsAreVisibleCallback setToolbarsAreVisible;
+ WKPageGetMenuBarIsVisibleCallback menuBarIsVisible;
+ WKPageSetMenuBarIsVisibleCallback setMenuBarIsVisible;
+ WKPageGetStatusBarIsVisibleCallback statusBarIsVisible;
+ WKPageSetStatusBarIsVisibleCallback setStatusBarIsVisible;
+ WKPageGetIsResizableCallback isResizable;
+ WKPageSetIsResizableCallback setIsResizable;
+ WKPageGetWindowFrameCallback getWindowFrame;
+ WKPageSetWindowFrameCallback setWindowFrame;
+ WKPageRunBeforeUnloadConfirmPanelCallback_deprecatedForUseWithV6 runBeforeUnloadConfirmPanel_deprecatedForUseWithV6;
+ WKPageUIClientCallback didDraw;
+ WKPageUIClientCallback pageDidScroll;
+ WKPageExceededDatabaseQuotaCallback exceededDatabaseQuota;
+ WKPageRunOpenPanelCallback runOpenPanel;
+ WKPageDecidePolicyForGeolocationPermissionRequestCallback decidePolicyForGeolocationPermissionRequest;
+ WKPageHeaderHeightCallback headerHeight;
+ WKPageFooterHeightCallback footerHeight;
+ WKPageDrawHeaderCallback drawHeader;
+ WKPageDrawFooterCallback drawFooter;
+ WKPagePrintFrameCallback printFrame;
+ WKPageUIClientCallback runModal;
+ void* unused1; // Used to be didCompleteRubberBandForMainFrame
+ WKPageSaveDataToFileInDownloadsFolderCallback saveDataToFileInDownloadsFolder;
+ void* shouldInterruptJavaScript_unavailable;
+
+ // Version 1.
+ WKPageCreateNewPageCallback_deprecatedForUseWithV1 createNewPage_deprecatedForUseWithV1;
+ WKPageMouseDidMoveOverElementCallback mouseDidMoveOverElement;
+ WKPageDecidePolicyForNotificationPermissionRequestCallback decidePolicyForNotificationPermissionRequest;
+ WKPageUnavailablePluginButtonClickedCallback_deprecatedForUseWithV1 unavailablePluginButtonClicked_deprecatedForUseWithV1;
+
+ // Version 2.
+ WKPageShowColorPickerCallback showColorPicker;
+ WKPageHideColorPickerCallback hideColorPicker;
+ WKPageUnavailablePluginButtonClickedCallback unavailablePluginButtonClicked;
+
+ // Version 3.
+ WKPagePinnedStateDidChangeCallback pinnedStateDidChange;
+
+ // Version 4.
+ void* unused2; // Used to be didBeginTrackingPotentialLongMousePress.
+ void* unused3; // Used to be didRecognizeLongMousePress.
+ void* unused4; // Used to be didCancelTrackingPotentialLongMousePress.
+ WKPageIsPlayingAudioDidChangeCallback isPlayingAudioDidChange;
+
+ // Version 5.
+ WKPageDecidePolicyForUserMediaPermissionRequestCallback decidePolicyForUserMediaPermissionRequest;
+ WKPageDidClickAutoFillButtonCallback didClickAutoFillButton;
+ WKPageRunJavaScriptAlertCallback_deprecatedForUseWithV5 runJavaScriptAlert_deprecatedForUseWithV5;
+ WKPageRunJavaScriptConfirmCallback_deprecatedForUseWithV5 runJavaScriptConfirm_deprecatedForUseWithV5;
+ WKPageRunJavaScriptPromptCallback_deprecatedForUseWithV5 runJavaScriptPrompt_deprecatedForUseWithV5;
+ WKPageMediaSessionMetadataDidChangeCallback mediaSessionMetadataDidChange;
+
+ // Version 6.
+ WKPageCreateNewPageCallback createNewPage;
+ WKPageRunJavaScriptAlertCallback runJavaScriptAlert;
+ WKPageRunJavaScriptConfirmCallback runJavaScriptConfirm;
+ WKPageRunJavaScriptPromptCallback runJavaScriptPrompt;
+ WKCheckUserMediaPermissionCallback checkUserMediaPermissionForOrigin;
+
+ // Version 7.
+ WKPageRunBeforeUnloadConfirmPanelCallback runBeforeUnloadConfirmPanel;
+ WKFullscreenMayReturnToInlineCallback fullscreenMayReturnToInline;
+
+ // Version 8.
+ WKRequestPointerLockCallback requestPointerLock;
+ WKDidLosePointerLockCallback didLosePointerLock;
+
+ // Version 9.
+ WKHandleAutoplayEventCallback handleAutoplayEvent;
+
+ // Version 10.
+ WKSetHasVideoInPictureInPictureCallback setHasVideoInPictureInPicture;
+} WKPageUIClientV10;
+
#ifdef __cplusplus
}
#endif
Modified: trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm (216790 => 216791)
--- trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm 2017-05-12 20:43:02 UTC (rev 216790)
+++ trunk/Source/WebKit2/UIProcess/Cocoa/WebVideoFullscreenManagerProxy.mm 2017-05-12 20:49:26 UTC (rev 216791)
@@ -28,6 +28,7 @@
#if PLATFORM(IOS) && HAVE(AVKIT) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
+#import "APIUIClient.h"
#import "WebPageProxy.h"
#import "WebPlaybackSessionManagerProxy.h"
#import "WebProcessProxy.h"
@@ -35,6 +36,7 @@
#import "WebVideoFullscreenManagerProxyMessages.h"
#import <QuartzCore/CoreAnimation.h>
#import <WebCore/MachSendRight.h>
+#import <WebCore/MediaPlayerEnums.h>
#import <WebCore/QuartzCoreSPI.h>
#import <WebCore/TimeRanges.h>
#import <WebKitSystemInterface.h>
@@ -368,6 +370,7 @@
m_page->rootViewToWindow(initialRect, initialWindowRect);
interface->setupFullscreen(*model->layerHostView(), initialWindowRect, m_page->platformWindow(), videoFullscreenMode, allowsPictureInPicture);
#endif
+ m_page->uiClient().setHasVideoInPictureInPicture(m_page, videoFullscreenMode & MediaPlayerEnums::VideoFullscreenModePictureInPicture);
}
void WebVideoFullscreenManagerProxy::setHasVideo(uint64_t contextId, bool hasVideo)
@@ -496,6 +499,7 @@
void WebVideoFullscreenManagerProxy::fullscreenModeChanged(uint64_t contextId, WebCore::HTMLMediaElementEnums::VideoFullscreenMode mode)
{
+ m_page->uiClient().setHasVideoInPictureInPicture(m_page, mode & MediaPlayerEnums::VideoFullscreenModePictureInPicture);
m_page->send(Messages::WebVideoFullscreenManager::FullscreenModeChanged(contextId, mode), m_page->pageID());
}
Modified: trunk/Tools/ChangeLog (216790 => 216791)
--- trunk/Tools/ChangeLog 2017-05-12 20:43:02 UTC (rev 216790)
+++ trunk/Tools/ChangeLog 2017-05-12 20:49:26 UTC (rev 216791)
@@ -1,3 +1,21 @@
+2017-05-12 Jeremy Jones <jere...@apple.com>
+
+ Add UIClient callback for when picture-in-picture is activated.
+ https://bugs.webkit.org/show_bug.cgi?id=172023
+
+ Reviewed by Simon Fraser.
+
+ Added a test for WKPageUIClientV10 setHasVideoInPictureInPicture.
+
+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+ * TestWebKitAPI/Tests/WebKit2Cocoa/PictureInPictureDelegate.html: Added.
+ * TestWebKitAPI/Tests/WebKit2Cocoa/PictureInPictureDelegate.mm: Added.
+ (onLoadedCompletedCallback):
+ (waitUntilOnLoadIsCompleted):
+ (didFinishLoadForFrame):
+ (setHasVideoInPictureInPicture):
+ (TestWebKitAPI::TEST):
+
2017-05-12 Jonathan Bedard <jbed...@apple.com>
Unreviewed follow-up to r216776.
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (216790 => 216791)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2017-05-12 20:43:02 UTC (rev 216790)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2017-05-12 20:49:26 UTC (rev 216791)
@@ -126,6 +126,8 @@
37E7DD671EA071F3009B396D /* AdditionalReadAccessAllowedURLsPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37E7DD661EA071F3009B396D /* AdditionalReadAccessAllowedURLsPlugin.mm */; };
37FB72971DB2E82F00E41BE4 /* ContextMenuDefaultItemsHaveTags.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37FB72951DB2E82F00E41BE4 /* ContextMenuDefaultItemsHaveTags.mm */; };
3FBD1B4A1D3D66AB00E6D6FA /* FullscreenLayoutConstraints.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 3FBD1B491D39D1DB00E6D6FA /* FullscreenLayoutConstraints.html */; };
+ 3FCC4FE51EC4E8520076E37C /* PictureInPictureDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3FCC4FE41EC4E8520076E37C /* PictureInPictureDelegate.mm */; };
+ 3FCC4FE81EC4E8CA0076E37C /* PictureInPictureDelegate.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 3FCC4FE61EC4E87E0076E37C /* PictureInPictureDelegate.html */; };
448D7E471EA6C55500ECC756 /* EnvironmentUtilitiesTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 448D7E451EA6C55500ECC756 /* EnvironmentUtilitiesTest.cpp */; };
46397B951DC2C850009A78AE /* DOMNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 46397B941DC2C850009A78AE /* DOMNode.mm */; };
4647B1261EBA3B850041D7EF /* ProcessDidTerminate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4647B1251EBA3B730041D7EF /* ProcessDidTerminate.cpp */; };
@@ -688,6 +690,7 @@
dstPath = TestWebKitAPI.resources;
dstSubfolderSpec = 7;
files = (
+ 3FCC4FE81EC4E8CA0076E37C /* PictureInPictureDelegate.html in Copy Resources */,
55226A2F1EBA44B900C36AD0 /* large-red-square-image.html in Copy Resources */,
5797FE331EB15AB100B2F4A0 /* navigation-client-default-crypto.html in Copy Resources */,
0799C34B1EBA3301003B7532 /* disableGetUserMedia.html in Copy Resources */,
@@ -1060,6 +1063,8 @@
37FB72951DB2E82F00E41BE4 /* ContextMenuDefaultItemsHaveTags.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ContextMenuDefaultItemsHaveTags.mm; sourceTree = "<group>"; };
3F1B52681D3D7129008D60C4 /* FullscreenLayoutConstraints.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FullscreenLayoutConstraints.mm; sourceTree = "<group>"; };
3FBD1B491D39D1DB00E6D6FA /* FullscreenLayoutConstraints.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = FullscreenLayoutConstraints.html; sourceTree = "<group>"; };
+ 3FCC4FE41EC4E8520076E37C /* PictureInPictureDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PictureInPictureDelegate.mm; sourceTree = "<group>"; };
+ 3FCC4FE61EC4E87E0076E37C /* PictureInPictureDelegate.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = PictureInPictureDelegate.html; sourceTree = "<group>"; };
41973B5A1AF2286A006C7B36 /* FileSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileSystem.cpp; sourceTree = "<group>"; };
41973B5C1AF22875006C7B36 /* SharedBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SharedBuffer.cpp; sourceTree = "<group>"; };
440A1D3814A0103A008A66F2 /* URL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URL.cpp; sourceTree = "<group>"; };
@@ -1709,6 +1714,7 @@
2D8104CB1BEC13E70020DA46 /* FindInPage.mm */,
2D1FE0AF1AD465C1006CD9E6 /* FixedLayoutSize.mm */,
CD78E11A1DB7EA360014A2DE /* FullscreenDelegate.mm */,
+ 3FCC4FE41EC4E8520076E37C /* PictureInPictureDelegate.mm */,
3F1B52681D3D7129008D60C4 /* FullscreenLayoutConstraints.mm */,
CDE195B31CFE0ADE0053D256 /* FullscreenTopContentInset.mm */,
631EFFF51E7B5E8D00D2EBB8 /* Geolocation.mm */,
@@ -1916,6 +1922,7 @@
93575C551D30366E000D604D /* focus-inputs.html */,
F4F405BA1D4C0CF8007A9707 /* full-size-autoplaying-video-with-audio.html */,
CD78E11B1DB7EA360014A2DE /* FullscreenDelegate.html */,
+ 3FCC4FE61EC4E87E0076E37C /* PictureInPictureDelegate.html */,
3FBD1B491D39D1DB00E6D6FA /* FullscreenLayoutConstraints.html */,
CDE195B21CFE0ADE0053D256 /* FullscreenTopContentInset.html */,
636353A61E9861940009F8AF /* GeolocationGetCurrentPositionResult.html */,
@@ -2915,6 +2922,7 @@
7CCE7EFB1A411AE600447C4C /* InjectedBundleBasic.cpp in Sources */,
7CCE7EFC1A411AE600447C4C /* InjectedBundleFrameHitTest.cpp in Sources */,
7CCE7EFD1A411AE600447C4C /* InjectedBundleInitializationUserDataCallbackWins.cpp in Sources */,
+ 3FCC4FE51EC4E8520076E37C /* PictureInPictureDelegate.mm in Sources */,
7C83E0B81D0A64BD00FEBCF3 /* InjectedBundleMakeAllShadowRootsOpen.cpp in Sources */,
7CCE7EC31A411A7E00447C4C /* InspectorBar.mm in Sources */,
7CCE7EDA1A411A8700447C4C /* InstanceMethodSwizzler.mm in Sources */,
Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/PictureInPictureDelegate.html (0 => 216791)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/PictureInPictureDelegate.html (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/PictureInPictureDelegate.html 2017-05-12 20:49:26 UTC (rev 216791)
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <script>
+ document.addEventListener('mousedown', function(event) {
+ var target = document.getElementById('video');
+ target.webkitSetPresentationMode(target.webkitPresentationMode == "inline" ? "picture-in-picture" : "inline");
+ });
+ </script>
+ <style>
+ #video {
+ background-color: red;
+ width: 150px;
+ height: 150px;
+ }
+ </style>
+ </head>
+ <body _onload_="window._onloadcompleted_ = true; ">
+ <video id="video" playsinline src="" />
+ </body>
+</html>
+
+
Added: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/PictureInPictureDelegate.mm (0 => 216791)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/PictureInPictureDelegate.mm (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/PictureInPictureDelegate.mm 2017-05-12 20:49:26 UTC (rev 216791)
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2017 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"
+
+#if WK_API_ENABLED && PLATFORM(MAC)
+
+#import "PlatformUtilities.h"
+#import "PlatformWebView.h"
+#import "Test.h"
+#import <_javascript_Core/JSRetainPtr.h>
+#import <_javascript_Core/_javascript_Core.h>
+#import <WebKit/WKPagePrivateMac.h>
+#import <WebKit/WKPreferencesPrivate.h>
+#import <WebKit/WKSerializedScriptValue.h>
+#import <WebKit/WKUIDelegatePrivate.h>
+#import <WebKit/WKURLCF.h>
+#import <WebKit/WKView.h>
+#import <WebKit/WKViewPrivate.h>
+#import <WebKit/WKWebViewConfigurationPrivate.h>
+#import <WebKit/WKWebViewPrivate.h>
+#import <wtf/RetainPtr.h>
+
+static bool receivedLoadedMessage;
+
+static bool hasVideoInPictureInPictureValue;
+static bool hasVideoInPictureInPictureCalled;
+
+static bool _onLoadCompleted_ = false;
+static bool fetchOnLoadedCompletedDone = false;
+
+static void onLoadedCompletedCallback(WKSerializedScriptValueRef serializedResultValue, WKErrorRef error, void*)
+{
+ EXPECT_NULL(error);
+
+ JSGlobalContextRef scriptContext = JSGlobalContextCreate(0);
+
+ JSValueRef resultValue = WKSerializedScriptValueDeserialize(serializedResultValue, scriptContext, 0);
+ EXPECT_TRUE(JSValueIsBoolean(scriptContext, resultValue));
+
+ fetchOnLoadedCompletedDone = true;
+ _onLoadCompleted_ = JSValueToBoolean(scriptContext, resultValue);
+
+ JSGlobalContextRelease(scriptContext);
+}
+
+static void waitUntilOnLoadIsCompleted(WKPageRef page)
+{
+ _onLoadCompleted_ = false;
+ while (!onLoadCompleted) {
+ fetchOnLoadedCompletedDone = false;
+ WKPageRunJavaScriptInMainFrame(page, TestWebKitAPI::Util::toWK("window.onloadcompleted !== undefined").get(), 0, onLoadedCompletedCallback);
+ TestWebKitAPI::Util::run(&fetchOnLoadedCompletedDone);
+ }
+}
+
+static void didFinishLoadForFrame(WKPageRef, WKFrameRef, WKTypeRef, const void*)
+{
+ receivedLoadedMessage = true;
+}
+
+static void setHasVideoInPictureInPicture(WKPageRef, bool hasVideoInPictureInPicture, const void* context)
+{
+ hasVideoInPictureInPictureValue = hasVideoInPictureInPicture;
+ hasVideoInPictureInPictureCalled = true;
+}
+
+namespace TestWebKitAPI {
+
+TEST(PictureInPicture, WKPageUIClient)
+{
+ WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate());
+ WKRetainPtr<WKPageGroupRef> pageGroup(AdoptWK, WKPageGroupCreateWithIdentifier(Util::toWK("PictureInPicture").get()));
+ WKPreferencesRef preferences = WKPageGroupGetPreferences(pageGroup.get());
+ WKPreferencesSetFullScreenEnabled(preferences, true);
+ WKPreferencesSetAllowsPictureInPictureMediaPlayback(preferences, true);
+
+ PlatformWebView webView(context.get(), pageGroup.get());
+
+ WKPageUIClientV10 uiClient;
+ memset(&uiClient, 0, sizeof(uiClient));
+ uiClient.base.version = 10;
+ uiClient.base.clientInfo = NULL;
+ uiClient.setHasVideoInPictureInPicture = setHasVideoInPictureInPicture;
+ WKPageSetPageUIClient(webView.page(), &uiClient.base);
+
+ WKPageLoaderClientV0 loaderClient;
+ memset(&loaderClient, 0 , sizeof(loaderClient));
+ loaderClient.base.version = 0;
+ loaderClient.didFinishLoadForFrame = didFinishLoadForFrame;
+ WKPageSetPageLoaderClient(webView.page(), &loaderClient.base);
+
+ RetainPtr<NSWindow> window = adoptNS([[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100) styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]);
+ [window.get() makeKeyAndOrderFront:nil];
+ [window.get().contentView addSubview:webView.platformView()];
+
+ receivedLoadedMessage = false;
+ WKRetainPtr<WKURLRef> url(AdoptWK, Util::createURLForResource("PictureInPictureDelegate", "html"));
+ WKPageLoadURL(webView.page(), url.get());
+ TestWebKitAPI::Util::run(&receivedLoadedMessage);
+ waitUntilOnLoadIsCompleted(webView.page());
+
+ hasVideoInPictureInPictureValue = false;
+ hasVideoInPictureInPictureCalled = false;
+ webView.simulateButtonClick(kWKEventMouseButtonLeftButton, 5, 5, 0);
+ TestWebKitAPI::Util::run(&hasVideoInPictureInPictureCalled);
+ ASSERT_TRUE(hasVideoInPictureInPictureValue);
+
+ sleep(1); // Wait for PIPAgent to launch, or it won't call -pipDidClose: callback.
+
+ hasVideoInPictureInPictureCalled = false;
+ webView.simulateButtonClick(kWKEventMouseButtonLeftButton, 5, 5, 0);
+ TestWebKitAPI::Util::run(&hasVideoInPictureInPictureCalled);
+ ASSERT_FALSE(hasVideoInPictureInPictureValue);
+}
+
+} // namespace TestWebKitAPI
+
+#endif