• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<style>
4
5body {
6    display: -webkit-box;
7    margin: 0;
8    font-family: Sans-serif;
9    overflow: hidden;
10}
11
12#list {
13    width: 200px;
14    padding: 10px;
15}
16
17#list h1 {
18    margin: 0;
19    font-size: 16px;
20    padding: 0 0 14px 8px;
21    border-right: 4px solid LightGray;
22}
23
24#list ul {
25    margin: 0;
26    padding: 2px 0 0 0;
27    list-style: none;
28}
29
30#list a:target {
31    cursor: default;
32    pointer-events: none;
33    background-color: #eee;
34    border-right: 4px solid Gray;
35}
36
37#list li {
38    padding-bottom: 2px;
39}
40
41#list a {
42    padding: 8px 8px 8px 8px;
43    display: block;
44    border-right: 4px solid LightGray;
45    color: initial;
46    -webkit-transition-property: border-right, background-color;
47    -webkit-transition-duration: 0.4s;
48}
49
50#test {
51    display: -webkit-box;
52    -webkit-box-orient: vertical;
53    -webkit-box-flex: 0.5;
54}
55
56#arena {
57    -webkit-box-flex: 0.5;
58    border: none;
59    display: -webkit-box;
60}
61
62#description {
63    height: 200px;
64    font-size: 12px;
65    padding-right: 16px;
66    overflow: auto;
67}
68
69</style>
70<!-- LayoutTests location is hard-coded to avoid duplication of code. -->
71<script src="http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/media-file.js"></script>
72<script>
73
74var MEDIA_FILES_LOCATION = 'http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/content';
75
76var MEDIA_FILES;
77
78var TESTS = {
79
80'video': {
81    title: 'Typical video with controls',
82    description: '<p>Should have "Rewind", "Play", "Mute" buttons, timeline with time current and remaining shown.</p>' +
83                 '<p>You may see brief resize of the video when the metadata arrives and a brief flash of the "Loading..." status.</p>' +
84                 '<p>"Play" button should turn into "Pause" when playing, with current and remaining time should changing and the thumb ' +
85                 'of the timeline gliding smoothly along the track, updated every 200ms or so.</p>',
86    html: '<video controls src={video}></video>',
87},
88'audio': {
89    title: 'Typical audio with controls',
90    description: '<p>Should have "Rewind", "Play", "Mute" buttons, timeline with time current and remaining shown.</p>' +
91                 '<p>You may see brief resize of the video when the metadata arrives and a brief flash of the "Loading..." status.</p>' +
92                 '<p>"Play" button should turn into "Pause" when playing, with current and remaining time should changing and the thumb ' +
93                 'of the timeline gliding smoothly along the track, updated every 200ms or so.</p>',
94    html: '<audio controls src={audio}></audio>',
95},
96'video-volume': {
97    title: 'Video volume controls',
98    description: '<p>When hovering over the "Mute" button, a volume control should appear, showing its own "Mute" button and a volume slider.</p>' +
99                 '<p>You should be able to control the volume with the slider and mute/unmute using the "Mute" button</p>' +
100                 '<p>Moving the mouse away from the volume control should make the control disappear.</p>',
101    html: '<video controls src={video}></video>',
102},
103'audio-volume': {
104    title: 'Audio volume controls',
105    description: '<p>When hovering over the "Mute" button, a volume control should appear, showing its own "Mute" button and a volume slider.</p>' +
106                 '<p>You should be able to control the volume with the slider and mute/unmute using the "Mute" button</p>' +
107                 '<p>Moving the mouse away from the volume control should make the control disappear.</p>',
108    html: '<audio style="padding-top: 200px;" controls src={video}></audio>',
109},
110'audio-volume-neg': {
111    title: 'Audio volume controls (negative offset)',
112    description: '<p>When hovering over the "Mute" button, a volume control should appear, showing its own "Mute" button and a volume slider.</p>' +
113                 '<p>In this particular layout, the volume control should be positioned directly under the "Mute" button, showing two "Mute" buttons --' +
114                 'one on the main controls and another on the volume control.</p>' +
115                 '<p>You should be able to control the volume with the slider and mute/unmute using the "Mute" button</p>' +
116                 '<p>Moving the mouse away from the volume control or the "Mute" button should make the control disappear.</p>',
117    html: '<audio controls src={video}></audio>',
118},
119'video-zoomed': {
120    title: 'Magnified video',
121    description: '<p>Should have the same appearance as a typical video, except magnified 1.5 times.</p>' +
122                 '<p>Make sure that the appearance of controls does not changed when changing the page zoom.</p>',
123    html: '<video controls src={video} style="zoom:150%"></video>',
124},
125'controls-fade': {
126    title: 'Fading video controls',
127    description: '<p>When the video is playing, the controls should fade out when the mouse is away from the video and fade back in when the mouse is over the video.</p>' +
128                 '<p>The controls should not fade when the video is paused.</p>',
129    html: '<video controls src={video} autoplay></video>',
130},
131'timeline-resize': {
132    title: 'Timeline reacting to a resize',
133    description: '<p>When changing the width of the screen, the timeline should be the only one part of the controls changing its width.</p>' +
134                 '<p>At a certain minimum point, the current and remaining time should disappear, giving up their space to the timeline.</p>' +
135                 '<p>Conversely, when sizing the width up, the current and remaining time should come back into their places.',
136    html: '<video controls src={video} style="width:60%"></video>',
137},
138'toggle-controls': {
139    title: 'Toggling video controls',
140    description: '<p>When clicking on "Toggle Controls" button, the controls should appear and disappear.</p>' +
141                 '<p>The controls should have "Rewind", "Play", "Mute" buttons, timeline with time current and remaining shown.</p>',
142    js: function(click) {
143        if (!click)
144            return;
145
146        var video = document.getElementsByTagName('video')[0];
147        video.controls = !video.controls;
148    },
149    html: '<video src={video}></video><br><button onclick="test(true)">Toggle Controls</button>',
150},
151'toggle-controls-autoplay': {
152    title: 'Toggling video controls while playing',
153    description: '<p>When clicking on "Toggle Controls" button, the controls should appear and disappear.</p>' +
154                 '<p>The controls should have "Rewind", "Pause", "Mute" buttons, timeline with time current and remaining shown,' +
155                 'with current and remaining time should changing and the thumb of the timeline gliding smoothly along the track, updated every 200ms or so.</p>' +
156                 '<p>The controls should fade quickly if the mouse is not over the video.</p>',
157    js: function(click) {
158        if (!click)
159            return;
160
161        var video = document.getElementsByTagName('video')[0];
162        video.controls = !video.controls;
163    },
164    html: '<video src={video} autoplay></video><br><button onclick="test(true)">Toggle Controls</button>',
165},
166'invalid': {
167    title: 'Video with invalid media',
168    description: 'Should have "Rewind" and "Play" buttons, and "Loading..." status ' +
169                 'if supported. Should blink "Loading...", but not twitch or flash other controls if reloaded',
170    html: '<video controls src="foobar"></video>'
171},
172'video-no-source': {
173    title: 'Video with no source',
174    description: 'Should have "Rewind" and "Play" buttons. Should not blink/twitch if reloaded.',
175    html: '<video controls></video>'
176},
177'audio-no-source': {
178    title: 'Audio with no source',
179    description: 'Should have "Rewind" and "Play" buttons. Should not blink/twitch if reloaded.',
180    html: '<audio controls></audio>'
181},
182'controls-buffer-update': {
183    title: 'Buffer progress bar updates',
184    description: '<p>The buffer progress bar should continue to update prior to video playback.</p>' +
185                 '<p>Verify the progress bar representing the amount of video buffered continues to ' +
186                 'update prior to video playback. Keep the mouse pointer off the progress bar during this check ' +
187                 'as movement over the control will trigger a repaint which invalidates the test.</p><p>' +
188                 'It\'s expected that the video may stop buffering before the entire video is loaded.</p>',
189    html: '<video controls src="http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_640x360.mov' +
190          '?prevent_caching=' + new Date().getTime() + '"></video>'
191}
192
193};
194
195function configureMediaFiles()
196{
197    MEDIA_FILES = {
198        'audio': absoluteUrl(findMediaFile('audio', MEDIA_FILES_LOCATION + '/test')),
199        'video': absoluteUrl(findMediaFile('video', MEDIA_FILES_LOCATION + '/test')),
200        'video-captioned': absoluteUrl(MEDIA_FILES_LOCATION + '/counting-captioned.mov')
201    }
202
203    // FIXME: Add error reporting when resolving these fails.
204
205    function absoluteUrl(url)
206    {
207        var a = document.createElement('a');
208        a.href = url;
209        return '"' + a.href + '"';
210    }
211}
212
213function runTest()
214{
215    var test = TESTS[location.hash.substr(1)];
216    if (!test)
217        return;
218
219    var arena = document.getElementById('arena');
220    document.getElementById('description').innerHTML = '<h2>' + test.title + '</h2>' + test.description;
221    if (test.html) {
222        arena.contentDocument.body.innerHTML = test.html.replace(/{([\w-]+)}/g, function(s, type)
223        {
224            return (MEDIA_FILES[type] || '');
225        });
226    }
227
228    arena.contentDocument.body.appendChild(arena.contentDocument.createElement('script')).textContent = 'window.test = ' + (test.js ? String(test.js) : 'function() {}') + ';\nwindow.test()';
229}
230
231window.addEventListener('hashchange', runTest, false);
232
233window.addEventListener('DOMContentLoaded', function()
234{
235    configureMediaFiles();
236
237    var list = document.getElementById('list').appendChild(document.createElement('ul'));
238    for(var key in TESTS)
239        list.appendChild(document.createElement('li')).innerHTML = '<a href="#' + key + '" id="' + key + '">' + TESTS[key].title + '</a>';
240    runTest();
241}, false);
242
243</script>
244</head>
245<body>
246<div id="list">
247    <h1>Manual Tests of Media Controls Appearance</h1>
248</div>
249<div id="test">
250    <iframe id="arena"></iframe>
251    <div id="description"></div>
252</div>
253</body>
254</html>
255