diff --git a/fetch.js b/fetch.js index 70ebb8838c72cf0372aff3a94916cf8aea587ce3..ce474a03205409bb922d65602a3a763f80b2c57e 100644 --- a/fetch.js +++ b/fetch.js @@ -370,7 +370,12 @@ export function Request(input, options) { } this.method = normalizeMethod(options.method || this.method || 'GET') this.mode = options.mode || this.mode || null - this.signal = options.signal || this.signal + this.signal = options.signal || this.signal || (function () { + if ('AbortController' in global) { + var ctrl = new AbortController(); + return ctrl.signal; + } + }()); this.referrer = null if ((this.method === 'GET' || this.method === 'HEAD') && body) { diff --git a/test/test.js b/test/test.js index 92dd2bc0b71415954bfab042d6aa36bb22d19bb3..e775847b3a493328b315459a5281d843a64808df 100644 --- a/test/test.js +++ b/test/test.js @@ -1147,7 +1147,20 @@ exercise.forEach(function(exerciseMode) { }) featureDependent(suite, exerciseMode !== 'native' || support.aborting, 'aborting', function() { - test('initially aborted signal', function() { + test('Request init creates an AbortSignal without option', function() { + var request = new Request('/request') + assert.ok(request.signal); + assert.equal(request.signal.aborted, false); + }) + + test('Request init passes AbortSignal from option', function () { + var controller = new AbortController() + var request = new Request('/request', {signal: controller.signal}) + assert.ok(request.signal); + assert.deepEqual(controller.signal, request.signal); + }) + + test('initially aborted signal', function () { var controller = new AbortController() controller.abort()