Fix #5839 Add error event to source element (#6941)
* Fix #5839 Add error event to source element * Add test case for <source onError={callback}>
Hiroyuki Wada committed
Jun 9, 2016 at 05:30 UTC
518336e2fbe2c1371d24401ee4c43de0edb8c303
2 files changed
+31
-1
src/renderers/dom/shared/ReactDOMComponent.js
+11
-1
@@ -359,7 +359,15 @@ function trapBubbledEventsLocal() {
359
);
360
}
361
}
362
-
362
+ break;
363
+ case 'source':
364
+ inst._wrapperState.listeners = [
365
+ ReactBrowserEventEmitter.trapBubbledEvent(
366
+ EventConstants.topLevelTypes.topError,
367
+ 'error',
368
+ node
369
+ ),
370
+ ];
371
break;
372
case 'img':
373
inst._wrapperState.listeners = [
@@ -535,6 +543,7 @@ ReactDOMComponent.Mixin = {
543
case 'img':
544
case 'link':
545
case 'object':
546
+ case 'source':
547
case 'video':
548
this._wrapperState = {
549
listeners: null,
@@ -1143,6 +1152,7 @@ ReactDOMComponent.Mixin = {
1152
case 'img':
1153
case 'link':
1154
case 'object':
1155
+ case 'source':
1156
case 'video':
1157
var listeners = this._wrapperState.listeners;
1158
if (listeners) {
src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js
+20
@@ -723,6 +723,26 @@ describe('ReactDOMComponent', function() {
723
};
724
});
725
726
+ it('should work error event on <source> element', function() {
727
+ spyOn(console, 'error');
728
+ var container = document.createElement('div');
729
+ ReactDOM.render(
730
+ <video>
731
+ <source src="http://example.org/video" type="video/mp4" onError={(e) => console.error('onError called')} />
732
+ </video>,
733
+ container
734
+ );
735
+
736
+ var errorEvent = document.createEvent('Event');
737
+ errorEvent.initEvent('error', false, false);
738
+ container.getElementsByTagName('source')[0].dispatchEvent(errorEvent);
739
+
740
+ expect(console.error.calls.count()).toBe(1);
741
+ expect(console.error.calls.argsFor(0)[0]).toContain(
742
+ 'onError called'
743
+ );
744
+ });
745
+
746
it('should not duplicate uppercased selfclosing tags', function() {
747
var Container = React.createClass({
748
render: function() {