diff --git a/src/standard/utils.html b/src/standard/utils.html index e574d1745c..8321952e90 100644 --- a/src/standard/utils.html +++ b/src/standard/utils.html @@ -375,20 +375,22 @@ var cached = list[link.href]; var imprt = cached || link; var self = this; + var loadListener = function(e) { + e.target.__firedLoad = true; + e.target.removeEventListener('load', loadListener); + e.target.removeEventListener('error', errorListener); + return onload.call(self, e); + }; + var errorListener = function(e) { + e.target.__firedError = true; + e.target.removeEventListener('load', loadListener); + e.target.removeEventListener('error', errorListener); + return onerror.call(self, e); + }; if (onload) { - var loadListener = function(e) { - e.target.__firedLoad = true; - e.target.removeEventListener('load', loadListener); - return onload.call(self, e); - } imprt.addEventListener('load', loadListener); } if (onerror) { - var errorListener = function(e) { - e.target.__firedError = true; - e.target.removeEventListener('error', errorListener); - return onerror.call(self, e); - } imprt.addEventListener('error', errorListener); } // if already loaded/erroed, fire 'fake' load/error event diff --git a/test/unit/dynamic-import.html b/test/unit/dynamic-import.html index 9dbaf7fa0b..d5fa6a4b2f 100644 --- a/test/unit/dynamic-import.html +++ b/test/unit/dynamic-import.html @@ -65,6 +65,40 @@ }, null, true); }); + test('importHref does not leak event listeners on load', function(done) { + var errorSpy = sinon.spy(); + var loadSpy = sinon.spy(function(e) { + var target = e.target; + target.dispatchEvent(new Event('error')); + assert.isFalse(errorSpy.called, 'doesn\'t trigger the error event listener'); + setTimeout(function() { + loadSpy.reset(); + target.dispatchEvent(new Event('load')); + assert.isFalse(loadSpy.called, 'doesn\'t trigger the load event listener'); + done(); + }); + }); + + Polymer.Base.importHref('dynamic-imports/async-import.html', loadSpy, errorSpy, true); + }); + + test('importHref does not leak event listeners on error', function(done) { + var loadSpy = sinon.spy(); + var errorSpy = sinon.spy(function(e) { + var target = e.target; + target.dispatchEvent(new Event('load')); + assert.isFalse(loadSpy.called, 'doesn\'t trigger the load event listener'); + setTimeout(function() { + errorSpy.reset(); + target.dispatchEvent(new Event('error')); + assert.isFalse(errorSpy.called, 'doesn\'t trigger the error event listener'); + done(); + }); + }); + + Polymer.Base.importHref('dynamic-imports/async-import-invalid.html', loadSpy, errorSpy, true); + }); + }); });