"Access-Control-Allow-Origin"ヘッダが返らないリソースへのアクセス結果が、ユーザースクリプトマネージャによって異なることを検証するためのユーザースクリプト。
上記ユーザースクリプトをインストールして、テスト用ぺージを開く。
※結果は、開発者ツールのコンソールに出力
"Access-Control-Allow-Origin"ヘッダが返らないリソースへのアクセス結果が、ユーザースクリプトマネージャによって異なることを検証するためのユーザースクリプト。
上記ユーザースクリプトをインストールして、テスト用ぺージを開く。
※結果は、開発者ツールのコンソールに出力
// ==UserScript== | |
// @name CORS_TEST | |
// @namespace https://furyu.hatenablog.com/ | |
// @version 0.1 | |
// @description CORS TEST (Please access "https://nazo.furyutei.work/test/CORS/" and check the console log) | |
// @author furyu | |
// @match https://nazo.furyutei.work/test/CORS/* | |
// @grant GM_xmlhttpRequest | |
// @grant GM.xmlHttpRequest | |
// @connect furyu-tei.sakura.ne.jp | |
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js | |
// @require https://furyutei.github.io/jsTwitterOAuth/src/js/twitter-oauth/jQuery.setAjaxTransport_GM_xmlhttpRequest.js | |
// ==/UserScript== | |
( function () { | |
'use strict'; | |
var TEST_URL_BASE = 'https://furyu-tei.sakura.ne.jp/', | |
get_test_url = function () { | |
return TEST_URL_BASE + '?t=' + new Date().getTime(); | |
}, | |
test_number = 0, | |
show_result = function ( test_number, args ) { | |
var result = ( typeof args[ 1 ] == 'string' ) ? args[ 1 ] : args[ 0 ].arguments[ 1 ]; | |
if ( result == 'error' ) { | |
console.error( test_number, 'FAILURE:', args ); | |
} | |
else { | |
console.log( test_number, 'SUCCESS:', args ); | |
} | |
}; | |
$.Deferred().resolve() | |
.then( function () { | |
console.log( ++test_number, 'TEST: XMLHttpRequest()' ); | |
return $no_reject_wrapper( $promise_xmlhttprequest( get_test_url() ) ); | |
} ) | |
.then( function () { | |
show_result( test_number, arguments ); // Tampermonkey: FAILURE / Greasemonkey: SUCCESS | |
console.log( ++test_number, 'TEST: fetch()' ); | |
return $no_reject_wrapper( $promise_fetch( get_test_url() ) ); | |
} ) | |
.then( function () { | |
show_result( test_number, arguments ); // Tampermonkey: FAILURE / Greasemonkey: SUCCESS | |
if ( ( typeof GM_xmlhttpRequest != 'function' ) && ( typeof GM.xmlHttpRequest == 'function' ) ) { | |
window.GM_xmlhttpRequest = GM.xmlHttpRequest; | |
} | |
console.log( ++test_number, 'TEST: GM_xmlhttpRequest()' ); | |
return $no_reject_wrapper( $promise_gm_xmlhttprequest( get_test_url() ) ); | |
} ) | |
.then( function () { | |
show_result( test_number, arguments ); // Tampermonkey: SUCCESS / Greasemonkey: SUCCESS | |
console.log( ++test_number, 'TEST: $.ajax()' ); | |
return $no_reject_wrapper( $.ajax( get_test_url() ) ); | |
} ) | |
.then( function () { | |
show_result( test_number, arguments ); // Tampermonkey: FAILURE / Greasemonkey: SUCCESS | |
if ( typeof $.setAjaxTransport_GM_xmlhttpRequest == 'function' ) { | |
$.setAjaxTransport_GM_xmlhttpRequest(); | |
} | |
console.log( ++test_number, 'TEST: $.ajax() after $.setAjaxTransport_GM_xmlhttpRequest()' ); | |
return $no_reject_wrapper( $.ajax( get_test_url() ) ); | |
} ) | |
.then( function () { | |
show_result( test_number, arguments ); // Tampermonkey: SUCCESS / Greasemonkey: SUCCESS | |
} ); | |
function $promise_xmlhttprequest( url ) { | |
var $deferred = $.Deferred(), | |
$promise = $deferred.promise(), | |
xhr = new XMLHttpRequest(), | |
loadHandler = function () { | |
$deferred.resolve( xhr.responseText, 'success', xhr ); | |
}, | |
errorHandler = function () { | |
$deferred.reject( xhr, 'error' ); | |
}; | |
xhr.open( 'GET', url ); | |
xhr.addEventListener( 'load', loadHandler, false ); | |
xhr.addEventListener( 'error', errorHandler, false ); | |
xhr.send( null ); | |
return $promise; | |
} | |
function $promise_fetch( url ) { | |
var $deferred = $.Deferred(), | |
$promise = $deferred.promise(), | |
loadHandler = function ( response ) { | |
$deferred.resolve( response.text(), 'success', response ); | |
}, | |
errorHandler = function ( error ) { | |
$deferred.reject( error, 'error' ); | |
}; | |
fetch( url, { | |
method: 'GET', | |
mode : 'cors' | |
} ) | |
.then( loadHandler ) | |
.catch( errorHandler ); | |
return $promise; | |
} | |
function $promise_gm_xmlhttprequest( url ) { | |
var $deferred = $.Deferred(), | |
$promise = $deferred.promise(), | |
loadHandler = function ( response ) { | |
$deferred.resolve( response.responseText, 'success', response ); | |
}, | |
errorHandler = function ( response ) { | |
$deferred.reject( response, 'error' ); | |
}; | |
GM_xmlhttpRequest( { | |
method : 'GET', | |
url : url, | |
onload : loadHandler, | |
onerror : errorHandler | |
} ); | |
return $promise; | |
} | |
function $no_reject_wrapper( $orig_promise ) { | |
var $deferred = $.Deferred(), | |
$promise = $deferred.promise(), | |
doneHandler = function () { | |
//$deferred.resolveWith( $deferred, arguments ); // TODO: See [Issue #4040](https://github.com/jquery/jquery/issues/4040) | |
$deferred.resolve.call( $deferred, { arguments : arguments } ); | |
}; | |
$orig_promise | |
.always( doneHandler ); | |
return $promise; | |
} | |
} )(); | |
// end of CORS_TEST |
Greasemonkey (4.3)
1~5の全てでアクセス可能
Tampermonkey (4.6.5757) / Violentmonkey (2.9.1)
3, 5 のみアクセス可能(1, 2, 4は不可)
テストするアクセス方法