| <html> |
| <head> |
| <style> |
| |
| body { |
| display: -webkit-box; |
| margin: 0; |
| font-family: Sans-serif; |
| overflow: hidden; |
| } |
| |
| #list { |
| width: 200px; |
| padding: 10px; |
| } |
| |
| #list h1 { |
| margin: 0; |
| font-size: 16px; |
| padding: 0 0 14px 8px; |
| border-right: 4px solid LightGray; |
| } |
| |
| #list ul { |
| margin: 0; |
| padding: 2px 0 0 0; |
| list-style: none; |
| } |
| |
| #list a:target { |
| cursor: default; |
| pointer-events: none; |
| background-color: #eee; |
| border-right: 4px solid Gray; |
| } |
| |
| #list li { |
| padding-bottom: 2px; |
| } |
| |
| #list a { |
| padding: 8px 8px 8px 8px; |
| display: block; |
| border-right: 4px solid LightGray; |
| color: initial; |
| -webkit-transition-property: border-right, background-color; |
| -webkit-transition-duration: 0.4s; |
| } |
| |
| #test { |
| display: -webkit-box; |
| -webkit-box-orient: vertical; |
| -webkit-box-flex: 0.5; |
| } |
| |
| #arena { |
| -webkit-box-flex: 0.5; |
| border: none; |
| display: -webkit-box; |
| } |
| |
| #description { |
| height: 200px; |
| font-size: 12px; |
| padding-right: 16px; |
| overflow: auto; |
| } |
| |
| </style> |
| <!-- LayoutTests location is hard-coded to avoid duplication of code. --> |
| <script src="http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/media-file.js"></script> |
| <script> |
| |
| var MEDIA_FILES_LOCATION = 'http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/content'; |
| |
| var MEDIA_FILES; |
| |
| var TESTS = { |
| |
| 'video': { |
| title: 'Typical video with controls', |
| description: '<p>Should have "Rewind", "Play", "Mute" buttons, timeline with time current and remaining shown.</p>' + |
| '<p>You may see brief resize of the video when the metadata arrives and a brief flash of the "Loading..." status.</p>' + |
| '<p>"Play" button should turn into "Pause" when playing, with current and remaining time should changing and the thumb ' + |
| 'of the timeline gliding smoothly along the track, updated every 200ms or so.</p>', |
| html: '<video controls src={video}></video>', |
| }, |
| 'audio': { |
| title: 'Typical audio with controls', |
| description: '<p>Should have "Rewind", "Play", "Mute" buttons, timeline with time current and remaining shown.</p>' + |
| '<p>You may see brief resize of the video when the metadata arrives and a brief flash of the "Loading..." status.</p>' + |
| '<p>"Play" button should turn into "Pause" when playing, with current and remaining time should changing and the thumb ' + |
| 'of the timeline gliding smoothly along the track, updated every 200ms or so.</p>', |
| html: '<audio controls src={audio}></audio>', |
| }, |
| 'video-volume': { |
| title: 'Video volume controls', |
| description: '<p>When hovering over the "Mute" button, a volume control should appear, showing its own "Mute" button and a volume slider.</p>' + |
| '<p>You should be able to control the volume with the slider and mute/unmute using the "Mute" button</p>' + |
| '<p>Moving the mouse away from the volume control should make the control disappear.</p>', |
| html: '<video controls src={video}></video>', |
| }, |
| 'audio-volume': { |
| title: 'Audio volume controls', |
| description: '<p>When hovering over the "Mute" button, a volume control should appear, showing its own "Mute" button and a volume slider.</p>' + |
| '<p>You should be able to control the volume with the slider and mute/unmute using the "Mute" button</p>' + |
| '<p>Moving the mouse away from the volume control should make the control disappear.</p>', |
| html: '<audio style="padding-top: 200px;" controls src={video}></audio>', |
| }, |
| 'audio-volume-neg': { |
| title: 'Audio volume controls (negative offset)', |
| description: '<p>When hovering over the "Mute" button, a volume control should appear, showing its own "Mute" button and a volume slider.</p>' + |
| '<p>In this particular layout, the volume control should be positioned directly under the "Mute" button, showing two "Mute" buttons --' + |
| 'one on the main controls and another on the volume control.</p>' + |
| '<p>You should be able to control the volume with the slider and mute/unmute using the "Mute" button</p>' + |
| '<p>Moving the mouse away from the volume control or the "Mute" button should make the control disappear.</p>', |
| html: '<audio controls src={video}></audio>', |
| }, |
| 'video-zoomed': { |
| title: 'Magnified video', |
| description: '<p>Should have the same appearance as a typical video, except magnified 1.5 times.</p>' + |
| '<p>Make sure that the appearance of controls does not changed when changing the page zoom.</p>', |
| html: '<video controls src={video} style="zoom:150%"></video>', |
| }, |
| 'controls-fade': { |
| title: 'Fading video controls', |
| 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>' + |
| '<p>The controls should not fade when the video is paused.</p>', |
| html: '<video controls src={video} autoplay></video>', |
| }, |
| 'timeline-resize': { |
| title: 'Timeline reacting to a resize', |
| description: '<p>When changing the width of the screen, the timeline should be the only one part of the controls changing its width.</p>' + |
| '<p>At a certain minimum point, the current and remaining time should disappear, giving up their space to the timeline.</p>' + |
| '<p>Conversely, when sizing the width up, the current and remaining time should come back into their places.', |
| html: '<video controls src={video} style="width:60%"></video>', |
| }, |
| 'toggle-controls': { |
| title: 'Toggling video controls', |
| description: '<p>When clicking on "Toggle Controls" button, the controls should appear and disappear.</p>' + |
| '<p>The controls should have "Rewind", "Play", "Mute" buttons, timeline with time current and remaining shown.</p>', |
| js: function(click) { |
| if (!click) |
| return; |
| |
| var video = document.getElementsByTagName('video')[0]; |
| video.controls = !video.controls; |
| }, |
| html: '<video src={video}></video><br><button onclick="test(true)">Toggle Controls</button>', |
| }, |
| 'toggle-controls-autoplay': { |
| title: 'Toggling video controls while playing', |
| description: '<p>When clicking on "Toggle Controls" button, the controls should appear and disappear.</p>' + |
| '<p>The controls should have "Rewind", "Pause", "Mute" buttons, timeline with time current and remaining shown,' + |
| 'with current and remaining time should changing and the thumb of the timeline gliding smoothly along the track, updated every 200ms or so.</p>' + |
| '<p>The controls should fade quickly if the mouse is not over the video.</p>', |
| js: function(click) { |
| if (!click) |
| return; |
| |
| var video = document.getElementsByTagName('video')[0]; |
| video.controls = !video.controls; |
| }, |
| html: '<video src={video} autoplay></video><br><button onclick="test(true)">Toggle Controls</button>', |
| }, |
| 'closed-captions': { |
| title: 'Closed-captioned video', |
| description: '<p>If supported, should show a "CC" button, which should toggle display of closed captions.</p>' + |
| '<p>The state of the button should reflect the state of closed-captioning in the video (on at the start of the test).</p>', |
| js: function() { |
| var video = document.getElementsByTagName('video')[0]; |
| video.webkitClosedCaptionsVisible = true; |
| video.addEventListener('canplaythrough', function() |
| { |
| video.webkitClosedCaptionsVisible = true; |
| }, false); |
| }, |
| html: '<video controls src={video-captioned}></video>', |
| }, |
| 'invalid': { |
| title: 'Video with invalid media', |
| description: 'Should have "Rewind" and "Play" buttons, and "Loading..." status ' + |
| 'if supported. Should blink "Loading...", but not twitch or flash other controls if reloaded', |
| html: '<video controls src="foobar"></video>' |
| }, |
| 'video-no-source': { |
| title: 'Video with no source', |
| description: 'Should have "Rewind" and "Play" buttons. Should not blink/twitch if reloaded.', |
| html: '<video controls></video>' |
| }, |
| 'audio-no-source': { |
| title: 'Audio with no source', |
| description: 'Should have "Rewind" and "Play" buttons. Should not blink/twitch if reloaded.', |
| html: '<audio controls></audio>' |
| }, |
| 'controls-buffer-update': { |
| title: 'Buffer progress bar updates', |
| description: '<p>The buffer progress bar should continue to update prior to video playback.</p>' + |
| '<p>Verify the progress bar representing the amount of video buffered continues to ' + |
| 'update prior to video playback. Keep the mouse pointer off the progress bar during this check ' + |
| 'as movement over the control will trigger a repaint which invalidates the test.</p><p>' + |
| 'It\'s expected that the video may stop buffering before the entire video is loaded.</p>', |
| html: '<video controls src="http://movies.apple.com/movies/us/apple/ipoditunes/2007/touch/ads/apple_ipodtouch_touch_640x360.mov' + |
| '?prevent_caching=' + new Date().getTime() + '"></video>' |
| } |
| |
| }; |
| |
| function configureMediaFiles() |
| { |
| MEDIA_FILES = { |
| 'audio': absoluteUrl(findMediaFile('audio', MEDIA_FILES_LOCATION + '/test')), |
| 'video': absoluteUrl(findMediaFile('video', MEDIA_FILES_LOCATION + '/test')), |
| 'video-captioned': absoluteUrl(MEDIA_FILES_LOCATION + '/counting-captioned.mov') |
| } |
| |
| // FIXME: Add error reporting when resolving these fails. |
| |
| function absoluteUrl(url) |
| { |
| var a = document.createElement('a'); |
| a.href = url; |
| return '"' + a.href + '"'; |
| } |
| } |
| |
| function runTest() |
| { |
| var test = TESTS[location.hash.substr(1)]; |
| if (!test) |
| return; |
| |
| var arena = document.getElementById('arena'); |
| document.getElementById('description').innerHTML = '<h2>' + test.title + '</h2>' + test.description; |
| if (test.html) { |
| arena.contentDocument.body.innerHTML = test.html.replace(/{([\w-]+)}/g, function(s, type) |
| { |
| return (MEDIA_FILES[type] || ''); |
| }); |
| } |
| |
| arena.contentDocument.body.appendChild(arena.contentDocument.createElement('script')).textContent = 'window.test = ' + (test.js ? String(test.js) : 'function() {}') + ';\nwindow.test()'; |
| } |
| |
| window.addEventListener('hashchange', runTest, false); |
| |
| window.addEventListener('DOMContentLoaded', function() |
| { |
| configureMediaFiles(); |
| |
| var list = document.getElementById('list').appendChild(document.createElement('ul')); |
| for(var key in TESTS) |
| list.appendChild(document.createElement('li')).innerHTML = '<a href="#' + key + '" id="' + key + '">' + TESTS[key].title + '</a>'; |
| runTest(); |
| }, false); |
| |
| </script> |
| </head> |
| <body> |
| <div id="list"> |
| <h1>Manual Tests of Media Controls Appearance</h1> |
| </div> |
| <div id="test"> |
| <iframe id="arena"></iframe> |
| <div id="description"></div> |
| </div> |
| </body> |
| </html> |