Title: [216791] trunk
Revision
216791
Author
commit-qu...@webkit.org
Date
2017-05-12 13:49:26 -0700 (Fri, 12 May 2017)

Log Message

Add UIClient callback for when picture-in-picture is activated.
https://bugs.webkit.org/show_bug.cgi?id=172023

Patch by Jeremy Jones <jere...@apple.com> on 2017-05-12
Reviewed by Simon Fraser.

Source/WebKit2:

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):

Tools:

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):

Modified Paths

Added Paths

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
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to