| <title>Mixed range responses must be handled as an error.</title> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| <script src="../resources/get-host-info.js"></script> |
| <script src="../../media-resources/media-file.js"></script> |
| <body> |
| <script> |
| // This file tests the following behavior: |
| // 1. The audio element sends the first request. |
| // 2. mixed-range-response.php returns the first 3 bytes ("Ogg"). |
| // 3. The element sends the second request with "Range: bytes=3-" header. |
| // 4. mixed-range-response.php returns 206 response. |
| // 5. The element sends the third request to load-video.php. |
| // 6. load-video.php returns the audio file from the fourth byte. |
| // |
| // If the origin of 2. (mixed-range-response.php) and 6. (load-video.php) are |
| // different, an error should occur. |
| |
| function create_failure_audio_test(url, crossOrigin) { |
| return new Promise(function(resolve, reject) { |
| var audio = document.createElement('audio'); |
| if (crossOrigin) |
| audio.crossOrigin = crossOrigin; |
| audio.oncanplay = function() { |
| reject('canplay event should not be fired. url: ' + url); |
| }; |
| audio.onerror = resolve; |
| audio.src = url; |
| document.body.appendChild(audio); |
| }); |
| } |
| |
| function create_success_audio_test(url, crossOrigin) { |
| return new Promise(function(resolve, reject) { |
| var audio = document.createElement('audio'); |
| if (crossOrigin) |
| audio.crossOrigin = crossOrigin; |
| audio.oncanplay = resolve; |
| audio.onerror = function(e) { |
| reject('error event should not be fired. url: ' + url); |
| }; |
| audio.src = url; |
| document.body.appendChild(audio); |
| }); |
| } |
| |
| var HOST_INFO = get_host_info(); |
| var MIX_RESPONSE_PHP_PATH = '/media/resources/mixed-range-response.php'; |
| var REDIRECT_PHP_PATH = '/resources/redirect.php' |
| var AUDIO_PATH = '/media/resources/load-video.php?' + |
| 'name=../../../../media/content/silence.oga&type=audio/ogg'; |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_ORIGIN'] + REDIRECT_PHP_PATH + '?url=' + |
| encodeURIComponent(HOST_INFO['HTTP_ORIGIN'] + AUDIO_PATH)); |
| }, 'Redirect from same-origin to same-origin must succeed.'); |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_ORIGIN'] + REDIRECT_PHP_PATH + '?url=' + |
| encodeURIComponent(HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH)); |
| }, 'Redirect from same-origin to remote-origin must succeed.'); |
| |
| promise_test(function(t) { |
| return create_failure_audio_test( |
| HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH , |
| 'anonymous'); |
| }, 'CORS-disallowed remote-origin with crossOrigin=anonymous must fail.'); |
| |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH + '&cors_allow_origin=' + HOST_INFO['HTTP_ORIGIN'], |
| 'anonymous'); |
| }, 'CORS-allowed remote-origin with crossOrigin=anonymous must succeed.'); |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_ORIGIN'] + REDIRECT_PHP_PATH + '?url=' + |
| encodeURIComponent(HOST_INFO['HTTP_ORIGIN'] + AUDIO_PATH), |
| 'anonymous'); |
| }, 'Redirect from same-origin to same-origin with crossOrigin=anonymous must succeed.'); |
| |
| promise_test(function(t) { |
| return create_failure_audio_test( |
| HOST_INFO['HTTP_ORIGIN'] + REDIRECT_PHP_PATH + '?url=' + |
| encodeURIComponent(HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH), |
| 'anonymous'); |
| }, 'Redirect from same-origin to CORS-disallowed remote-origin with crossOrigin=anonymous must fail.'); |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_ORIGIN'] + REDIRECT_PHP_PATH + '?url=' + |
| encodeURIComponent(HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH + |
| '&cors_allow_origin=' + HOST_INFO['HTTP_ORIGIN']), |
| 'anonymous'); |
| }, 'Redirect from same-origin to CORS-allowed remote-origin with crossOrigin=anonymous must succeed.'); |
| |
| promise_test(function(t) { |
| return create_failure_audio_test( |
| HOST_INFO['HTTP_REMOTE_ORIGIN'] + REDIRECT_PHP_PATH + '?url=' + |
| encodeURIComponent(HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH + |
| '&cors_allow_origin=' + HOST_INFO['HTTP_ORIGIN']), |
| 'anonymous'); |
| }, 'Redirect from CORS-disallowed remote-origin to CORS-allowed remote-origin with crossOrigin=anonymous must fail.'); |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_REMOTE_ORIGIN'] + REDIRECT_PHP_PATH + '?url=' + |
| encodeURIComponent(HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH + |
| '&cors_allow_origin=' + HOST_INFO['HTTP_ORIGIN']) + |
| '&cors_allow_origin=' + HOST_INFO['HTTP_ORIGIN'], |
| 'anonymous'); |
| }, 'Redirect from CORS-allowed remote-origin to CORS-allowed remote-origin with crossOrigin=anonymous must succeed.'); |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_ORIGIN'] + MIX_RESPONSE_PHP_PATH + '?location=' + |
| encodeURIComponent(HOST_INFO['HTTP_ORIGIN'] + AUDIO_PATH)); |
| }, 'Mixing same-origin responses must succeed.'); |
| |
| promise_test(function(t) { |
| return create_failure_audio_test( |
| HOST_INFO['HTTP_ORIGIN'] + MIX_RESPONSE_PHP_PATH + '?location=' + |
| encodeURIComponent(HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH)); |
| }, 'Mixing same-origin response and remote-origin response must fail.'); |
| |
| promise_test(function(t) { |
| return create_failure_audio_test( |
| HOST_INFO['HTTP_REMOTE_ORIGIN'] + MIX_RESPONSE_PHP_PATH + '?location=' + |
| encodeURIComponent(HOST_INFO['HTTP_ORIGIN'] + AUDIO_PATH)); |
| }, 'Mixing remote-origin response and same-origin response must fail.'); |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_REMOTE_ORIGIN'] + MIX_RESPONSE_PHP_PATH + '?location=' + |
| encodeURIComponent(HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH)); |
| }, 'Mixing same remote-origin responses must succeed.'); |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_REMOTE_ORIGIN'] + MIX_RESPONSE_PHP_PATH + '?location=' + |
| encodeURIComponent(HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH + |
| '&cors_allow_origin=' + HOST_INFO['HTTP_ORIGIN']) + |
| '&cors_allow_origin=' + HOST_INFO['HTTP_ORIGIN'], |
| 'anonymous'); |
| }, 'Mixing same CORS-allowed remote-origin responses with crossOrigin=anonymous must succeed.'); |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_ORIGIN'] + MIX_RESPONSE_PHP_PATH + '?location=' + |
| encodeURIComponent(HOST_INFO['HTTP_REMOTE_ORIGIN'] + AUDIO_PATH + |
| '&cors_allow_origin=' + HOST_INFO['HTTP_ORIGIN']), |
| 'anonymous'); |
| }, 'Mixing same-origin response and CORS-allowed remote-origin response with crossOrigin=anonymous must succeed.'); |
| |
| promise_test(function(t) { |
| return create_success_audio_test( |
| HOST_INFO['HTTP_REMOTE_ORIGIN'] + MIX_RESPONSE_PHP_PATH + '?location=' + |
| encodeURIComponent(HOST_INFO['HTTP_ORIGIN'] + AUDIO_PATH + '&cors_allow_origin=*') + |
| '&cors_allow_origin=' + HOST_INFO['HTTP_ORIGIN'], |
| 'anonymous'); |
| }, 'Mixing CORS-allowed remote-origin response and same-origin response with crossOrigin=anonymous must succeed.'); |
| </script> |
| </body> |