[WebKitLegacy] Media playback pauses on scroll
[WebKit-https.git] / Tools / TestWebKitAPI / Tests / WebKitLegacy / ios / ScrollingDoesNotPauseMedia.mm
1 /*
2  * Copyright (C) 2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27
28 #if PLATFORM(IOS_FAMILY)
29
30 #import "PlatformUtilities.h"
31 #import <WebKit/DOMHTMLMediaElement.h>
32 #import <WebKit/WebFramePrivate.h>
33 #import <wtf/RetainPtr.h>
34
35 @interface ScrollingDoesNotPauseMediaDelegate : NSObject <UIWebViewDelegate, DOMEventListener> {
36 }
37 @end
38
39 static bool didFinishLoad;
40 static bool gotMainFrame;
41 static WebFrame* mainFrame;
42
43 @implementation ScrollingDoesNotPauseMediaDelegate
44
45 IGNORE_WARNINGS_BEGIN("deprecated-implementations")
46 - (void)webViewDidFinishLoad:(UIWebView *)webView
47 IGNORE_WARNINGS_END
48 {
49     didFinishLoad = true;
50 }
51
52 - (void)uiWebView:(UIWebView *)sender didCommitLoadForFrame:(WebFrame *)frame
53 {
54     mainFrame = frame;
55     gotMainFrame = true;
56 }
57
58 static bool didReceivePause;
59 static bool didReceivePlaying;
60
61 - (void)handleEvent:(DOMEvent *)event
62 {
63     if ([event.type isEqualToString:@"pause"])
64         didReceivePause = true;
65     else if ([event.type isEqualToString:@"playing"])
66         didReceivePlaying = true;
67 }
68 @end
69
70 namespace TestWebKitAPI {
71
72 TEST(WebKitLegacy, ScrollingDoesNotPauseMedia)
73 {
74     RetainPtr<UIWindow> uiWindow = adoptNS([[UIWindow alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
75     RetainPtr<UIWebView> uiWebView = adoptNS([[UIWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
76     [uiWindow addSubview:uiWebView.get()];
77
78     uiWebView.get().mediaPlaybackRequiresUserAction = NO;
79     uiWebView.get().allowsInlineMediaPlayback = YES;
80
81     RetainPtr<ScrollingDoesNotPauseMediaDelegate> testController = adoptNS([ScrollingDoesNotPauseMediaDelegate new]);
82     uiWebView.get().delegate = testController.get();
83
84     didFinishLoad = false;
85     gotMainFrame = false;
86     mainFrame = nil;
87
88     [uiWebView loadRequest:[NSURLRequest requestWithURL:[NSBundle.mainBundle URLForResource:@"video-with-audio" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]];
89
90     Util::run(&didFinishLoad);
91     Util::run(&gotMainFrame);
92
93     DOMHTMLMediaElement* video = (DOMHTMLMediaElement*)[mainFrame.DOMDocument querySelector:@"video"];
94     ASSERT_TRUE([video isKindOfClass:[DOMHTMLMediaElement class]]);
95
96     [video addEventListener:@"playing" listener:testController.get() useCapture:NO];
97     [video addEventListener:@"pause" listener:testController.get() useCapture:NO];
98
99     [mainFrame setTimeoutsPaused:YES];
100
101     didReceivePlaying = false;
102     [video play];
103     Util::run(&didReceivePlaying);
104
105     [mainFrame setTimeoutsPaused:NO];
106
107     didReceivePause = false;
108     [video play];
109     Util::run(&didReceivePause);
110 }
111
112 } // namespace TestWebKitAPI
113
114 #endif