Changeset 254553 in webkit


Ignore:
Timestamp:
Jan 14, 2020 6:21:56 PM (4 years ago)
Author:
commit-queue@webkit.org
Message:

Update API availability for autoplay event
https://bugs.webkit.org/show_bug.cgi?id=202214
<rdar://problem/55710395>

Patch by Luming Yin <luming_yin@apple.com> on 2020-01-14
Reviewed by Tim Horton.

Source/WebKit:

  • UIProcess/API/Cocoa/WKUIDelegatePrivate.h:

Make enums and WKUIDelegate method related to autoplay event available on iOS.

  • UIProcess/Cocoa/UIDelegate.h:
  • UIProcess/Cocoa/UIDelegate.mm:

(WebKit::UIDelegate::setDelegate):
(WebKit::toWKAutoplayEventFlags):
(WebKit::toWKAutoplayEvent):
(WebKit::UIDelegate::UIClient::handleAutoplayEvent):
Make delegate methods related to autoplay events available on iOS.

Tools:

  • TestWebKitAPI/Tests/WebKit/js-play-with-controls.html:
  • TestWebKitAPI/Tests/WebKitCocoa/audio-with-play-button.html:
  • TestWebKitAPI/Tests/WebKitCocoa/video-with-play-button.html:

Provide an id for each play button on various testing pages so that they can be triggered on iOS.

  • TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:

(-[AutoplayPoliciesDelegate _webView:handleAutoplayEvent:withFlags:]):
(-[AsyncAutoplayPoliciesDelegate _webView:handleAutoplayEvent:withFlags:]):
(TEST):
Enable tests related to autoplay policy on iOS.

  • TestWebKitAPI/cocoa/TestWKWebView.h:
  • TestWebKitAPI/cocoa/TestWKWebView.mm:

(-[TestWKWebView clickOnElementID:]):
Helper method that performs a click on a given element ID.

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r254552 r254553  
     12020-01-14  Luming Yin  <luming_yin@apple.com>
     2
     3        Update API availability for autoplay event
     4        https://bugs.webkit.org/show_bug.cgi?id=202214
     5        <rdar://problem/55710395>
     6
     7        Reviewed by Tim Horton.
     8
     9        * UIProcess/API/Cocoa/WKUIDelegatePrivate.h:
     10        Make enums and WKUIDelegate method related to autoplay event available on iOS.
     11
     12        * UIProcess/Cocoa/UIDelegate.h:
     13        * UIProcess/Cocoa/UIDelegate.mm:
     14        (WebKit::UIDelegate::setDelegate):
     15        (WebKit::toWKAutoplayEventFlags):
     16        (WebKit::toWKAutoplayEvent):
     17        (WebKit::UIDelegate::UIClient::handleAutoplayEvent):
     18        Make delegate methods related to autoplay events available on iOS.
     19
    1202020-01-14  Tim Horton  <timothy_horton@apple.com>
    221
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKUIDelegatePrivate.h

    r253465 r254553  
    5151@protocol UIDropSession;
    5252#else
     53typedef NS_ENUM(NSInteger, _WKResourceLimit) {
     54    _WKResourceLimitMemory,
     55    _WKResourceLimitCPU,
     56} WK_API_AVAILABLE(macos(10.13.4));
     57
     58typedef NS_ENUM(NSInteger, _WKPlugInUnavailabilityReason) {
     59    _WKPlugInUnavailabilityReasonPluginMissing,
     60    _WKPlugInUnavailabilityReasonPluginCrashed,
     61    _WKPlugInUnavailabilityReasonInsecurePluginVersion
     62} WK_API_AVAILABLE(macos(10.13.4));
     63#endif
     64
    5365typedef NS_ENUM(NSInteger, _WKAutoplayEvent) {
    5466    _WKAutoplayEventDidPreventFromAutoplaying,
     
    5668    _WKAutoplayEventDidAutoplayMediaPastThresholdWithoutUserInterference,
    5769    _WKAutoplayEventUserDidInterfereWithPlayback,
    58 } WK_API_AVAILABLE(macos(10.13.4));
    59 
    60 typedef NS_ENUM(NSInteger, _WKResourceLimit) {
    61     _WKResourceLimitMemory,
    62     _WKResourceLimitCPU,
    63 } WK_API_AVAILABLE(macos(10.13.4));
    64 
    65 typedef NS_ENUM(NSInteger, _WKPlugInUnavailabilityReason) {
    66     _WKPlugInUnavailabilityReasonPluginMissing,
    67     _WKPlugInUnavailabilityReasonPluginCrashed,
    68     _WKPlugInUnavailabilityReasonInsecurePluginVersion
    69 } WK_API_AVAILABLE(macos(10.13.4));
     70} WK_API_AVAILABLE(macos(10.13.4), ios(WK_IOS_TBA));
    7071
    7172typedef NS_OPTIONS(NSUInteger, _WKAutoplayEventFlags) {
     
    7475    _WKAutoplayEventFlagsPlaybackWasPrevented = 1 << 1,
    7576    _WKAutoplayEventFlagsMediaIsMainContent = 1 << 2,
    76 } WK_API_AVAILABLE(macos(10.13.4));
    77 #endif
     77} WK_API_AVAILABLE(macos(10.13.4), ios(WK_IOS_TBA));
    7878
    7979typedef NS_ENUM(NSInteger, _WKFocusDirection) {
     
    140140
    141141- (void)_webView:(WKWebView *)webView runWebAuthenticationPanel:(_WKWebAuthenticationPanel *)panel initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(_WKWebAuthenticationPanelResult))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
     142
     143- (void)_webView:(WKWebView *)webView handleAutoplayEvent:(_WKAutoplayEvent)event withFlags:(_WKAutoplayEventFlags)flags WK_API_AVAILABLE(macos(10.13.4), ios(WK_IOS_TBA));
    142144
    143145#if TARGET_OS_IPHONE
     
    218220- (void)_webViewRunModal:(WKWebView *)webView WK_API_AVAILABLE(macos(10.13.4));
    219221- (void)_webView:(WKWebView *)webView didNotHandleWheelEvent:(NSEvent *)event WK_API_AVAILABLE(macos(10.13.4));
    220 - (void)_webView:(WKWebView *)webView handleAutoplayEvent:(_WKAutoplayEvent)event withFlags:(_WKAutoplayEventFlags)flags WK_API_AVAILABLE(macos(10.13.4));
    221222- (void)_webView:(WKWebView *)webView didClickAutoFillButtonWithUserInfo:(id <NSSecureCoding>)userInfo WK_API_AVAILABLE(macos(10.13.4));
    222223- (void)_webView:(WKWebView *)webView getToolbarsAreVisibleWithCompletionHandler:(void(^)(BOOL))completionHandler WK_API_AVAILABLE(macos(10.13.4));
  • trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.h

    r252634 r254553  
    101101        void didResignInputElementStrongPasswordAppearance(WebPageProxy&, API::Object*) final;
    102102        bool takeFocus(WebPageProxy*, WKFocusDirection) final;
     103        void handleAutoplayEvent(WebPageProxy&, WebCore::AutoplayEvent, OptionSet<WebCore::AutoplayEventFlags>) final;
    103104#if PLATFORM(MAC)
    104105        void showPage(WebPageProxy*) final;
     
    117118        void drawFooter(WebPageProxy&, WebFrameProxy&, WebCore::FloatRect&&) final;
    118119        void decidePolicyForNotificationPermissionRequest(WebPageProxy&, API::SecurityOrigin&, Function<void(bool)>&&) final;
    119         void handleAutoplayEvent(WebPageProxy&, WebCore::AutoplayEvent, OptionSet<WebCore::AutoplayEventFlags>) final;
    120120        void unavailablePluginButtonClicked(WebPageProxy&, WKPluginUnavailabilityReason, API::Dictionary&) final;
    121121        void mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData&, OptionSet<WebEvent::Modifier>, API::Object*);
     
    177177        bool webViewDidResignInputElementStrongPasswordAppearanceWithUserInfo : 1;
    178178        bool webViewTakeFocus : 1;
     179        bool webViewHandleAutoplayEventWithFlags : 1;
    179180#if PLATFORM(MAC)
    180181        bool showWebView : 1;
     
    188189        bool webViewSetWindowFrame : 1;
    189190        bool webViewDidNotHandleWheelEvent : 1;
    190         bool webViewHandleAutoplayEventWithFlags : 1;
    191191        bool webViewUnavailablePlugInButtonClicked : 1;
    192192        bool webViewDidClickAutoFillButtonWithUserInfo : 1;
  • trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm

    r254075 r254553  
    110110    m_delegateMethods.webViewDidResignInputElementStrongPasswordAppearanceWithUserInfo = [delegate respondsToSelector:@selector(_webView:didResignInputElementStrongPasswordAppearanceWithUserInfo:)];
    111111    m_delegateMethods.webViewTakeFocus = [delegate respondsToSelector:@selector(_webView:takeFocus:)];
     112    m_delegateMethods.webViewHandleAutoplayEventWithFlags = [delegate respondsToSelector:@selector(_webView:handleAutoplayEvent:withFlags:)];
    112113
    113114#if PLATFORM(MAC)
     
    123124    m_delegateMethods.webViewSetWindowFrame = [delegate respondsToSelector:@selector(_webView:setWindowFrame:)];
    124125    m_delegateMethods.webViewUnavailablePlugInButtonClicked = [delegate respondsToSelector:@selector(_webView:unavailablePlugInButtonClickedWithReason:plugInInfo:)];
    125     m_delegateMethods.webViewHandleAutoplayEventWithFlags = [delegate respondsToSelector:@selector(_webView:handleAutoplayEvent:withFlags:)];
    126126    m_delegateMethods.webViewDidClickAutoFillButtonWithUserInfo = [delegate respondsToSelector:@selector(_webView:didClickAutoFillButtonWithUserInfo:)];
    127127    m_delegateMethods.webViewDrawHeaderInRectForPageWithTitleURL = [delegate respondsToSelector:@selector(_webView:drawHeaderInRect:forPageWithTitle:URL:)];
     
    487487}
    488488
    489 #if PLATFORM(MAC)
    490 bool UIDelegate::UIClient::canRunModal() const
    491 {
    492     return m_uiDelegate.m_delegateMethods.webViewRunModal;
    493 }
    494 
    495 void UIDelegate::UIClient::runModal(WebPageProxy&)
    496 {
    497     if (!m_uiDelegate.m_delegateMethods.webViewRunModal)
    498         return;
    499    
    500     auto delegate = m_uiDelegate.m_delegate.get();
    501     if (!delegate)
    502         return;
    503 
    504     [(id <WKUIDelegatePrivate>)delegate _webViewRunModal:m_uiDelegate.m_webView];
    505 }
    506 
    507 float UIDelegate::UIClient::headerHeight(WebPageProxy&, WebFrameProxy& webFrameProxy)
    508 {
    509     if (!m_uiDelegate.m_delegateMethods.webViewHeaderHeight)
    510         return 0;
    511    
    512     auto delegate = m_uiDelegate.m_delegate.get();
    513     if (!delegate)
    514         return 0;
    515    
    516     return [(id <WKUIDelegatePrivate>)delegate _webViewHeaderHeight:m_uiDelegate.m_webView];
    517 }
    518 
    519 float UIDelegate::UIClient::footerHeight(WebPageProxy&, WebFrameProxy&)
    520 {
    521     if (!m_uiDelegate.m_delegateMethods.webViewFooterHeight)
    522         return 0;
    523    
    524     auto delegate = m_uiDelegate.m_delegate.get();
    525     if (!delegate)
    526         return 0;
    527    
    528     return [(id <WKUIDelegatePrivate>)delegate _webViewFooterHeight:m_uiDelegate.m_webView];
    529 }
    530 
    531 void UIDelegate::UIClient::drawHeader(WebPageProxy&, WebFrameProxy& frame, WebCore::FloatRect&& rect)
    532 {
    533     if (!m_uiDelegate.m_delegateMethods.webViewDrawHeaderInRectForPageWithTitleURL)
    534         return;
    535    
    536     auto delegate = m_uiDelegate.m_delegate.get();
    537     if (!delegate)
    538         return;
    539    
    540     [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView drawHeaderInRect:rect forPageWithTitle:frame.title() URL:frame.url()];
    541 }
    542 
    543 void UIDelegate::UIClient::drawFooter(WebPageProxy&, WebFrameProxy& frame, WebCore::FloatRect&& rect)
    544 {
    545     if (!m_uiDelegate.m_delegateMethods.webViewDrawFooterInRectForPageWithTitleURL)
    546         return;
    547    
    548     auto delegate = m_uiDelegate.m_delegate.get();
    549     if (!delegate)
    550         return;
    551    
    552     [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView drawFooterInRect:rect forPageWithTitle:frame.title() URL:frame.url()];
    553 }
    554 
    555 void UIDelegate::UIClient::pageDidScroll(WebPageProxy*)
    556 {
    557     if (!m_uiDelegate.m_delegateMethods.webViewDidScroll)
    558         return;
    559    
    560     auto delegate = m_uiDelegate.m_delegate.get();
    561     if (!delegate)
    562         return;
    563    
    564     [(id <WKUIDelegatePrivate>)delegate _webViewDidScroll:m_uiDelegate.m_webView];
    565 }
    566 
    567 void UIDelegate::UIClient::focus(WebPageProxy*)
    568 {
    569     if (!m_uiDelegate.m_delegateMethods.focusWebView)
    570         return;
    571    
    572     auto delegate = m_uiDelegate.m_delegate.get();
    573     if (!delegate)
    574         return;
    575    
    576     [(id <WKUIDelegatePrivate>)delegate _focusWebView:m_uiDelegate.m_webView];
    577 }
    578 
    579 void UIDelegate::UIClient::unfocus(WebPageProxy*)
    580 {
    581     if (!m_uiDelegate.m_delegateMethods.unfocusWebView)
    582         return;
    583    
    584     auto delegate = m_uiDelegate.m_delegate.get();
    585     if (!delegate)
    586         return;
    587    
    588     [(id <WKUIDelegatePrivate>)delegate _unfocusWebView:m_uiDelegate.m_webView];
    589 }
    590 
    591 static _WKPlugInUnavailabilityReason toWKPlugInUnavailabilityReason(WKPluginUnavailabilityReason reason)
    592 {
    593     switch (reason) {
    594     case kWKPluginUnavailabilityReasonPluginMissing:
    595         return _WKPlugInUnavailabilityReasonPluginMissing;
    596     case kWKPluginUnavailabilityReasonPluginCrashed:
    597         return _WKPlugInUnavailabilityReasonPluginCrashed;
    598     case kWKPluginUnavailabilityReasonInsecurePluginVersion:
    599         return _WKPlugInUnavailabilityReasonInsecurePluginVersion;
    600     }
    601     ASSERT_NOT_REACHED();
    602     return _WKPlugInUnavailabilityReasonPluginMissing;
    603 }
    604    
    605 void UIDelegate::UIClient::unavailablePluginButtonClicked(WebPageProxy&, WKPluginUnavailabilityReason reason, API::Dictionary& plugInInfo)
    606 {
    607     if (!m_uiDelegate.m_delegateMethods.webViewUnavailablePlugInButtonClicked)
    608         return;
    609    
    610     auto delegate = m_uiDelegate.m_delegate.get();
    611     if (!delegate)
    612         return;
    613 
    614     [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView unavailablePlugInButtonClickedWithReason:toWKPlugInUnavailabilityReason(reason) plugInInfo:wrapper(plugInInfo)];
    615 }
    616    
    617 static _WKResourceLimit toWKResourceLimit(WKResourceLimit limit)
    618 {
    619     switch (limit) {
    620     case kWKResourceLimitMemory:
    621         return _WKResourceLimitMemory;
    622     case kWKResourceLimitCPU:
    623         return _WKResourceLimitCPU;
    624     }
    625     ASSERT_NOT_REACHED();
    626     return _WKResourceLimitMemory;
    627 }
    628 
    629 void UIDelegate::UIClient::didExceedBackgroundResourceLimitWhileInForeground(WebPageProxy&, WKResourceLimit limit)
    630 {
    631     if (!m_uiDelegate.m_delegateMethods.webViewDidExceedBackgroundResourceLimitWhileInForeground)
    632         return;
    633    
    634     auto delegate = m_uiDelegate.m_delegate.get();
    635     if (!delegate)
    636         return;
    637    
    638     [static_cast<id <WKUIDelegatePrivate>>(delegate) _webView:m_uiDelegate.m_webView didExceedBackgroundResourceLimitWhileInForeground:toWKResourceLimit(limit)];
    639 }
    640 
    641 void UIDelegate::UIClient::didNotHandleWheelEvent(WebPageProxy*, const NativeWebWheelEvent& event)
    642 {
    643     if (!m_uiDelegate.m_delegateMethods.webViewDidNotHandleWheelEvent)
    644         return;
    645    
    646     auto delegate = m_uiDelegate.m_delegate.get();
    647     if (!delegate)
    648         return;
    649    
    650     [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView didNotHandleWheelEvent:event.nativeEvent()];
    651 }
    652 
    653 void UIDelegate::UIClient::setIsResizable(WebKit::WebPageProxy&, bool resizable)
    654 {
    655     if (!m_uiDelegate.m_delegateMethods.webViewSetResizable)
    656         return;
    657    
    658     auto delegate = m_uiDelegate.m_delegate.get();
    659     if (!delegate)
    660         return;
    661    
    662     [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView setResizable:resizable];
    663 }
    664 
    665 void UIDelegate::UIClient::setWindowFrame(WebKit::WebPageProxy&, const WebCore::FloatRect& frame)
    666 {
    667     if (!m_uiDelegate.m_delegateMethods.webViewSetWindowFrame)
    668         return;
    669    
    670     auto delegate = m_uiDelegate.m_delegate.get();
    671     if (!delegate)
    672         return;
    673    
    674     [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView setWindowFrame:frame];
    675 }
    676 
    677 void UIDelegate::UIClient::windowFrame(WebKit::WebPageProxy&, Function<void(WebCore::FloatRect)>&& completionHandler)
    678 {
    679     if (!m_uiDelegate.m_delegateMethods.webViewGetWindowFrameWithCompletionHandler)
    680         return completionHandler({ });
    681    
    682     auto delegate = m_uiDelegate.m_delegate.get();
    683     if (!delegate)
    684         return completionHandler({ });
    685    
    686     [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView getWindowFrameWithCompletionHandler:makeBlockPtr([completionHandler = WTFMove(completionHandler), checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(_webView:getWindowFrameWithCompletionHandler:))](CGRect frame) {
    687         if (checker->completionHandlerHasBeenCalled())
    688             return;
    689         checker->didCallCompletionHandler();
    690         completionHandler(frame);
    691     }).get()];
    692 }
    693 
    694 void UIDelegate::UIClient::mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData& data, OptionSet<WebEvent::Modifier> modifiers, API::Object* userInfo)
    695 {
    696     if (!m_uiDelegate.m_delegateMethods.webViewMouseDidMoveOverElementWithFlagsUserInfo)
    697         return;
    698 
    699     auto delegate = m_uiDelegate.m_delegate.get();
    700     if (!delegate)
    701         return;
    702 
    703     auto apiHitTestResult = API::HitTestResult::create(data);
    704     [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView mouseDidMoveOverElement:wrapper(apiHitTestResult.get()) withFlags:WebEventFactory::toNSEventModifierFlags(modifiers) userInfo:userInfo ? static_cast<id <NSSecureCoding>>(userInfo->wrapper()) : nil];
    705 }
    706 
    707489static _WKAutoplayEventFlags toWKAutoplayEventFlags(OptionSet<WebCore::AutoplayEventFlags> flags)
    708490{
     
    734516}
    735517
     518void UIDelegate::UIClient::handleAutoplayEvent(WebPageProxy&, WebCore::AutoplayEvent event, OptionSet<WebCore::AutoplayEventFlags> flags)
     519{
     520    if (!m_uiDelegate.m_delegateMethods.webViewHandleAutoplayEventWithFlags)
     521        return;
     522   
     523    auto delegate = m_uiDelegate.m_delegate.get();
     524    if (!delegate)
     525        return;
     526   
     527    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView handleAutoplayEvent:toWKAutoplayEvent(event) withFlags:toWKAutoplayEventFlags(flags)];
     528}
     529
     530#if PLATFORM(MAC)
     531bool UIDelegate::UIClient::canRunModal() const
     532{
     533    return m_uiDelegate.m_delegateMethods.webViewRunModal;
     534}
     535
     536void UIDelegate::UIClient::runModal(WebPageProxy&)
     537{
     538    if (!m_uiDelegate.m_delegateMethods.webViewRunModal)
     539        return;
     540   
     541    auto delegate = m_uiDelegate.m_delegate.get();
     542    if (!delegate)
     543        return;
     544
     545    [(id <WKUIDelegatePrivate>)delegate _webViewRunModal:m_uiDelegate.m_webView];
     546}
     547
     548float UIDelegate::UIClient::headerHeight(WebPageProxy&, WebFrameProxy& webFrameProxy)
     549{
     550    if (!m_uiDelegate.m_delegateMethods.webViewHeaderHeight)
     551        return 0;
     552   
     553    auto delegate = m_uiDelegate.m_delegate.get();
     554    if (!delegate)
     555        return 0;
     556   
     557    return [(id <WKUIDelegatePrivate>)delegate _webViewHeaderHeight:m_uiDelegate.m_webView];
     558}
     559
     560float UIDelegate::UIClient::footerHeight(WebPageProxy&, WebFrameProxy&)
     561{
     562    if (!m_uiDelegate.m_delegateMethods.webViewFooterHeight)
     563        return 0;
     564   
     565    auto delegate = m_uiDelegate.m_delegate.get();
     566    if (!delegate)
     567        return 0;
     568   
     569    return [(id <WKUIDelegatePrivate>)delegate _webViewFooterHeight:m_uiDelegate.m_webView];
     570}
     571
     572void UIDelegate::UIClient::drawHeader(WebPageProxy&, WebFrameProxy& frame, WebCore::FloatRect&& rect)
     573{
     574    if (!m_uiDelegate.m_delegateMethods.webViewDrawHeaderInRectForPageWithTitleURL)
     575        return;
     576   
     577    auto delegate = m_uiDelegate.m_delegate.get();
     578    if (!delegate)
     579        return;
     580   
     581    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView drawHeaderInRect:rect forPageWithTitle:frame.title() URL:frame.url()];
     582}
     583
     584void UIDelegate::UIClient::drawFooter(WebPageProxy&, WebFrameProxy& frame, WebCore::FloatRect&& rect)
     585{
     586    if (!m_uiDelegate.m_delegateMethods.webViewDrawFooterInRectForPageWithTitleURL)
     587        return;
     588   
     589    auto delegate = m_uiDelegate.m_delegate.get();
     590    if (!delegate)
     591        return;
     592   
     593    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView drawFooterInRect:rect forPageWithTitle:frame.title() URL:frame.url()];
     594}
     595
     596void UIDelegate::UIClient::pageDidScroll(WebPageProxy*)
     597{
     598    if (!m_uiDelegate.m_delegateMethods.webViewDidScroll)
     599        return;
     600   
     601    auto delegate = m_uiDelegate.m_delegate.get();
     602    if (!delegate)
     603        return;
     604   
     605    [(id <WKUIDelegatePrivate>)delegate _webViewDidScroll:m_uiDelegate.m_webView];
     606}
     607
     608void UIDelegate::UIClient::focus(WebPageProxy*)
     609{
     610    if (!m_uiDelegate.m_delegateMethods.focusWebView)
     611        return;
     612   
     613    auto delegate = m_uiDelegate.m_delegate.get();
     614    if (!delegate)
     615        return;
     616   
     617    [(id <WKUIDelegatePrivate>)delegate _focusWebView:m_uiDelegate.m_webView];
     618}
     619
     620void UIDelegate::UIClient::unfocus(WebPageProxy*)
     621{
     622    if (!m_uiDelegate.m_delegateMethods.unfocusWebView)
     623        return;
     624   
     625    auto delegate = m_uiDelegate.m_delegate.get();
     626    if (!delegate)
     627        return;
     628   
     629    [(id <WKUIDelegatePrivate>)delegate _unfocusWebView:m_uiDelegate.m_webView];
     630}
     631
     632static _WKPlugInUnavailabilityReason toWKPlugInUnavailabilityReason(WKPluginUnavailabilityReason reason)
     633{
     634    switch (reason) {
     635    case kWKPluginUnavailabilityReasonPluginMissing:
     636        return _WKPlugInUnavailabilityReasonPluginMissing;
     637    case kWKPluginUnavailabilityReasonPluginCrashed:
     638        return _WKPlugInUnavailabilityReasonPluginCrashed;
     639    case kWKPluginUnavailabilityReasonInsecurePluginVersion:
     640        return _WKPlugInUnavailabilityReasonInsecurePluginVersion;
     641    }
     642    ASSERT_NOT_REACHED();
     643    return _WKPlugInUnavailabilityReasonPluginMissing;
     644}
     645   
     646void UIDelegate::UIClient::unavailablePluginButtonClicked(WebPageProxy&, WKPluginUnavailabilityReason reason, API::Dictionary& plugInInfo)
     647{
     648    if (!m_uiDelegate.m_delegateMethods.webViewUnavailablePlugInButtonClicked)
     649        return;
     650   
     651    auto delegate = m_uiDelegate.m_delegate.get();
     652    if (!delegate)
     653        return;
     654
     655    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView unavailablePlugInButtonClickedWithReason:toWKPlugInUnavailabilityReason(reason) plugInInfo:wrapper(plugInInfo)];
     656}
     657   
     658static _WKResourceLimit toWKResourceLimit(WKResourceLimit limit)
     659{
     660    switch (limit) {
     661    case kWKResourceLimitMemory:
     662        return _WKResourceLimitMemory;
     663    case kWKResourceLimitCPU:
     664        return _WKResourceLimitCPU;
     665    }
     666    ASSERT_NOT_REACHED();
     667    return _WKResourceLimitMemory;
     668}
     669
     670void UIDelegate::UIClient::didExceedBackgroundResourceLimitWhileInForeground(WebPageProxy&, WKResourceLimit limit)
     671{
     672    if (!m_uiDelegate.m_delegateMethods.webViewDidExceedBackgroundResourceLimitWhileInForeground)
     673        return;
     674   
     675    auto delegate = m_uiDelegate.m_delegate.get();
     676    if (!delegate)
     677        return;
     678   
     679    [static_cast<id <WKUIDelegatePrivate>>(delegate) _webView:m_uiDelegate.m_webView didExceedBackgroundResourceLimitWhileInForeground:toWKResourceLimit(limit)];
     680}
     681
     682void UIDelegate::UIClient::didNotHandleWheelEvent(WebPageProxy*, const NativeWebWheelEvent& event)
     683{
     684    if (!m_uiDelegate.m_delegateMethods.webViewDidNotHandleWheelEvent)
     685        return;
     686   
     687    auto delegate = m_uiDelegate.m_delegate.get();
     688    if (!delegate)
     689        return;
     690   
     691    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView didNotHandleWheelEvent:event.nativeEvent()];
     692}
     693
     694void UIDelegate::UIClient::setIsResizable(WebKit::WebPageProxy&, bool resizable)
     695{
     696    if (!m_uiDelegate.m_delegateMethods.webViewSetResizable)
     697        return;
     698   
     699    auto delegate = m_uiDelegate.m_delegate.get();
     700    if (!delegate)
     701        return;
     702   
     703    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView setResizable:resizable];
     704}
     705
     706void UIDelegate::UIClient::setWindowFrame(WebKit::WebPageProxy&, const WebCore::FloatRect& frame)
     707{
     708    if (!m_uiDelegate.m_delegateMethods.webViewSetWindowFrame)
     709        return;
     710   
     711    auto delegate = m_uiDelegate.m_delegate.get();
     712    if (!delegate)
     713        return;
     714   
     715    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView setWindowFrame:frame];
     716}
     717
     718void UIDelegate::UIClient::windowFrame(WebKit::WebPageProxy&, Function<void(WebCore::FloatRect)>&& completionHandler)
     719{
     720    if (!m_uiDelegate.m_delegateMethods.webViewGetWindowFrameWithCompletionHandler)
     721        return completionHandler({ });
     722   
     723    auto delegate = m_uiDelegate.m_delegate.get();
     724    if (!delegate)
     725        return completionHandler({ });
     726   
     727    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView getWindowFrameWithCompletionHandler:makeBlockPtr([completionHandler = WTFMove(completionHandler), checker = CompletionHandlerCallChecker::create(delegate.get(), @selector(_webView:getWindowFrameWithCompletionHandler:))](CGRect frame) {
     728        if (checker->completionHandlerHasBeenCalled())
     729            return;
     730        checker->didCallCompletionHandler();
     731        completionHandler(frame);
     732    }).get()];
     733}
     734
     735void UIDelegate::UIClient::mouseDidMoveOverElement(WebPageProxy&, const WebHitTestResultData& data, OptionSet<WebEvent::Modifier> modifiers, API::Object* userInfo)
     736{
     737    if (!m_uiDelegate.m_delegateMethods.webViewMouseDidMoveOverElementWithFlagsUserInfo)
     738        return;
     739
     740    auto delegate = m_uiDelegate.m_delegate.get();
     741    if (!delegate)
     742        return;
     743
     744    auto apiHitTestResult = API::HitTestResult::create(data);
     745    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView mouseDidMoveOverElement:wrapper(apiHitTestResult.get()) withFlags:WebEventFactory::toNSEventModifierFlags(modifiers) userInfo:userInfo ? static_cast<id <NSSecureCoding>>(userInfo->wrapper()) : nil];
     746}
     747
    736748void UIDelegate::UIClient::toolbarsAreVisible(WebPageProxy&, Function<void(bool)>&& completionHandler)
    737749{
     
    761773   
    762774    [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView didClickAutoFillButtonWithUserInfo:userInfo ? static_cast<id <NSSecureCoding>>(userInfo->wrapper()) : nil];
    763 }
    764 
    765 void UIDelegate::UIClient::handleAutoplayEvent(WebPageProxy&, WebCore::AutoplayEvent event, OptionSet<WebCore::AutoplayEventFlags> flags)
    766 {
    767     if (!m_uiDelegate.m_delegateMethods.webViewHandleAutoplayEventWithFlags)
    768         return;
    769    
    770     auto delegate = m_uiDelegate.m_delegate.get();
    771     if (!delegate)
    772         return;
    773    
    774     [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView handleAutoplayEvent:toWKAutoplayEvent(event) withFlags:toWKAutoplayEventFlags(flags)];
    775775}
    776776
  • trunk/Tools/ChangeLog

    r254547 r254553  
     12020-01-14  Luming Yin  <luming_yin@apple.com>
     2
     3        Update API availability for autoplay event
     4        https://bugs.webkit.org/show_bug.cgi?id=202214
     5        <rdar://problem/55710395>
     6
     7        Reviewed by Tim Horton.
     8
     9        * TestWebKitAPI/Tests/WebKit/js-play-with-controls.html:
     10        * TestWebKitAPI/Tests/WebKitCocoa/audio-with-play-button.html:
     11        * TestWebKitAPI/Tests/WebKitCocoa/video-with-play-button.html:
     12        Provide an id for each play button on various testing pages so that they can be triggered on iOS.
     13
     14        * TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm:
     15        (-[AutoplayPoliciesDelegate _webView:handleAutoplayEvent:withFlags:]):
     16        (-[AsyncAutoplayPoliciesDelegate _webView:handleAutoplayEvent:withFlags:]):
     17        (TEST):
     18        Enable tests related to autoplay policy on iOS.
     19
     20        * TestWebKitAPI/cocoa/TestWKWebView.h:
     21        * TestWebKitAPI/cocoa/TestWKWebView.mm:
     22        (-[TestWKWebView clickOnElementID:]):
     23        Helper method that performs a click on a given element ID.
     24
    1252020-01-14  Jonathan Bedard  <jbedard@apple.com>
    226
  • trunk/Tools/TestWebKitAPI/Tests/WebKit/js-play-with-controls.html

    r213316 r254553  
    3535    </head>
    3636    <body onload="pageLoaded()">
    37         <button onclick="play()">Play</button>
    38         <button onclick="mute()">Mute</button>
     37        <button id="playButton" onclick="play()">Play</button>
     38        <button id="muteButton" onclick="mute()">Mute</button>
    3939        <video id="video" onplaying=beganPlaying() onended=endedPlaying() src="test.mp4" />
    4040    </body>
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm

    r254005 r254553  
    6464static bool finishedNavigation;
    6565
    66 #if PLATFORM(MAC)
    6766static Optional<_WKAutoplayEvent> receivedAutoplayEvent;
    6867static Optional<_WKAutoplayEventFlags> receivedAutoplayEventFlags;
    69 #endif
    7068
    7169static size_t alertCount;
     
    199197}
    200198
    201 #if PLATFORM(MAC)
    202199- (void)_webView:(WKWebView *)webView handleAutoplayEvent:(_WKAutoplayEvent)event withFlags:(_WKAutoplayEventFlags)flags
    203200{
     
    205202    receivedAutoplayEvent = event;
    206203}
    207 #endif
    208204
    209205@end
     
    235231}
    236232
    237 #if PLATFORM(MAC)
    238233- (void)_webView:(WKWebView *)webView handleAutoplayEvent:(_WKAutoplayEvent)event withFlags:(_WKAutoplayEventFlags)flags
    239234{
     
    241236    receivedAutoplayEvent = event;
    242237}
    243 #endif
    244238
    245239@end
     
    266260
    267261#if PLATFORM(IOS_FAMILY)
    268     [configuration setAllowsInlineMediaPlayback:YES];
     262    configuration.get().allowsInlineMediaPlayback = YES;
     263    configuration.get()._inlineMediaPlaybackRequiresPlaysInlineAttribute = NO;
    269264#endif
    270265
     
    355350}
    356351
    357 #if PLATFORM(MAC)
    358352static void runUntilReceivesAutoplayEvent(WKAutoplayEvent event)
    359353{
     
    362356}
    363357
     358#if PLATFORM(MAC)
    364359TEST(WebpagePreferences, WebsitePoliciesPlayAfterPreventedAutoplay)
    365360{
     
    432427    ASSERT_TRUE(*receivedAutoplayEventFlags & kWKAutoplayEventFlagsPlaybackWasPrevented);
    433428}
     429#endif
    434430
    435431TEST(WebpagePreferences, WebsitePoliciesPlayingWithUserGesture)
    436432{
    437433    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     434#if PLATFORM(IOS_FAMILY)
     435    configuration.get().allowsInlineMediaPlayback = YES;
     436    configuration.get()._inlineMediaPlaybackRequiresPlaysInlineAttribute = NO;
     437#endif
     438
    438439    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
    439440
     
    447448    receivedAutoplayEvent = WTF::nullopt;
    448449
     450#if PLATFORM(MAC)
    449451    NSPoint playButtonClickPoint = NSMakePoint(20, 580);
     452#endif
    450453
    451454    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"audio-with-play-button" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
    452455    [webView loadRequest:request];
    453456    [webView waitForMessage:@"loaded"];
     457
     458#if PLATFORM(MAC)
    454459    [webView mouseDownAtPoint:playButtonClickPoint simulatePressure:NO];
    455460    [webView mouseUpAtPoint:playButtonClickPoint];
     461#else
     462    [webView clickOnElementID:@"playButton"];
     463#endif
    456464
    457465    runUntilReceivesAutoplayEvent(kWKAutoplayEventDidPlayMediaWithUserGesture);
     
    464472    [webView loadRequest:request];
    465473    [webView waitForMessage:@"loaded"];
     474
     475#if PLATFORM(MAC)
    466476    [webView mouseDownAtPoint:playButtonClickPoint simulatePressure:NO];
    467477    [webView mouseUpAtPoint:playButtonClickPoint];
     478#else
     479    [webView clickOnElementID:@"playButton"];
     480#endif
    468481
    469482    runUntilReceivesAutoplayEvent(kWKAutoplayEventDidPlayMediaWithUserGesture);
     
    475488{
    476489    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     490#if PLATFORM(IOS_FAMILY)
     491    configuration.get().allowsInlineMediaPlayback = YES;
     492    configuration.get()._inlineMediaPlaybackRequiresPlaysInlineAttribute = NO;
     493#endif
     494
    477495    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 336, 276) configuration:configuration.get()]);
    478496
     
    494512{
    495513    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     514#if PLATFORM(IOS_FAMILY)
     515    configuration.get().allowsInlineMediaPlayback = YES;
     516    configuration.get()._inlineMediaPlaybackRequiresPlaysInlineAttribute = NO;
     517#endif
     518
    496519    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 336, 276) configuration:configuration.get()]);
    497520
     
    518541    ASSERT_TRUE(receivedAutoplayEvent == WTF::nullopt);
    519542
     543#if PLATFORM(MAC)
    520544    const NSPoint muteButtonClickPoint = NSMakePoint(80, 256);
    521545    [webView mouseDownAtPoint:muteButtonClickPoint simulatePressure:NO];
    522546    [webView mouseUpAtPoint:muteButtonClickPoint];
     547#else
     548    [webView clickOnElementID:@"muteButton"];
     549#endif
     550
    523551    runUntilReceivesAutoplayEvent(kWKAutoplayEventUserDidInterfereWithPlayback);
    524552    ASSERT_TRUE(*receivedAutoplayEventFlags & kWKAutoplayEventFlagsHasAudio);
     
    529557    ASSERT_TRUE(receivedAutoplayEvent == WTF::nullopt);
    530558
     559#if PLATFORM(MAC)
    531560    const NSPoint playButtonClickPoint = NSMakePoint(20, 256);
    532561    [webView mouseDownAtPoint:playButtonClickPoint simulatePressure:NO];
    533562    [webView mouseUpAtPoint:playButtonClickPoint];
     563#else
     564    [webView clickOnElementID:@"playButton"];
     565#endif
     566
    534567    runUntilReceivesAutoplayEvent(kWKAutoplayEventUserDidInterfereWithPlayback);
    535568    ASSERT_TRUE(*receivedAutoplayEventFlags & kWKAutoplayEventFlagsHasAudio);
    536569}
    537570
     571#if PLATFORM(MAC)
    538572TEST(WebpagePreferences, WebsitePoliciesPerDocumentAutoplayBehaviorMediaLoading)
    539573{
     
    714748    [webView waitForMessage:@"autoplayed"];
    715749}
     750#endif // PLATFORM(MAC)
    716751
    717752TEST(WebpagePreferences, WebsitePoliciesUpdates)
    718753{
    719754    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     755#if PLATFORM(IOS_FAMILY)
     756    configuration.get().allowsInlineMediaPlayback = YES;
     757    configuration.get()._inlineMediaPlaybackRequiresPlaysInlineAttribute = NO;
     758#endif
     759
    720760    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
    721761    auto delegate = adoptNS([[AutoplayPoliciesDelegate alloc] init]);
     
    751791}
    752792
     793#if PLATFORM(MAC)
    753794TEST(WebpagePreferences, WebsitePoliciesArbitraryUserGestureQuirk)
    754795{
     
    904945    [webView waitForMessage:@"did-not-play-video2"];
    905946}
     947#endif
    906948
    907949TEST(WebpagePreferences, WebsitePoliciesAutoplayQuirksAsyncPolicyDelegate)
    908950{
    909951    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     952#if PLATFORM(IOS_FAMILY)
     953    configuration.get().allowsInlineMediaPlayback = YES;
     954    configuration.get()._inlineMediaPlaybackRequiresPlaysInlineAttribute = NO;
     955#endif
     956    [configuration preferences]._needsSiteSpecificQuirks = YES;
    910957    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
    911958
    912959    auto delegate = adoptNS([[AsyncAutoplayPoliciesDelegate alloc] init]);
    913960    [webView setNavigationDelegate:delegate.get()];
    914 
    915     WKRetainPtr<WKPreferencesRef> preferences = adoptWK(WKPreferencesCreate());
    916     WKPreferencesSetNeedsSiteSpecificQuirks(preferences.get(), true);
    917     WKPageGroupSetPreferences(WKPageGetPageGroup([webView _pageForTesting]), preferences.get());
    918961
    919962    NSURLRequest *requestWithAudio = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"autoplay-check" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
     
    947990    [webView waitForMessage:@"on-pause"];
    948991}
    949 #endif // PLATFORM(MAC)
    950992
    951993TEST(WebpagePreferences, InvalidCustomHeaders)
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/audio-with-play-button.html

    r239625 r254553  
    2222    </head>
    2323    <body onload="pageLoaded()">
    24         <button onclick="play()">Play</button>
     24        <button id="playButton" onclick="play()">Play</button>
    2525        <br />
    2626        <audio controls id="audio" onplaying="beganPlaying()" src="silence-long.m4a" />
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/video-with-play-button.html

    r239625 r254553  
    2222    </head>
    2323    <body onload="pageLoaded()">
    24         <button onclick="play()">Play</button>
     24        <button id="playButton" onclick="play()">Play</button>
    2525        <br />
    2626        <video controls id="video" onplaying="beganPlaying()" src="long-test.mp4"></video>
  • trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.h

    r253950 r254553  
    8787- (void)addToTestWindow;
    8888- (BOOL)selectionRangeHasStartOffset:(int)start endOffset:(int)end;
     89- (void)clickOnElementID:(NSString *)elementID;
    8990@end
    9091
  • trunk/Tools/TestWebKitAPI/cocoa/TestWKWebView.mm

    r253950 r254553  
    516516}
    517517
     518- (void)clickOnElementID:(NSString *)elementID
     519{
     520    [self evaluateJavaScript:[NSString stringWithFormat:@"document.getElementById('%@').click();", elementID] completionHandler:nil];
     521}
     522
    518523#if PLATFORM(IOS_FAMILY)
    519524
Note: See TracChangeset for help on using the changeset viewer.