diff --git a/src/renderers/dom/client/ReactBrowserEventEmitter.js b/src/renderers/dom/client/ReactBrowserEventEmitter.js index dd7334f48463b..5f34d2ac2b52f 100644 --- a/src/renderers/dom/client/ReactBrowserEventEmitter.js +++ b/src/renderers/dom/client/ReactBrowserEventEmitter.js @@ -191,6 +191,13 @@ var ReactBrowserEventEmitter = Object.assign({}, ReactEventEmitterMixin, { ); ReactBrowserEventEmitter.ReactEventListener = ReactEventListener; }, + + /** + * @param {boolean} hasEventPageXY + */ + injectHasEventPageXY: function(val) { + hasEventPageXY = val; + }, }, /** @@ -359,8 +366,12 @@ var ReactBrowserEventEmitter = Object.assign({}, ReactEventEmitterMixin, { */ ensureScrollValueMonitoring: function() { if (hasEventPageXY === undefined) { - hasEventPageXY = - document.createEvent && 'pageX' in document.createEvent('MouseEvent'); + if (document.createEvent) { + var evt = document.createEvent('MouseEvent'); + hasEventPageXY = evt !== null && 'pageX' in evt; + } else { + hasEventPageXY = false; + } } if (!hasEventPageXY && !isMonitoringScrollValue) { var refresh = ViewportMetrics.refreshScrollValues; diff --git a/src/renderers/dom/client/__tests__/ReactBrowserEventEmitter-test.js b/src/renderers/dom/client/__tests__/ReactBrowserEventEmitter-test.js index 009bc5d223608..1cd094f7a7491 100644 --- a/src/renderers/dom/client/__tests__/ReactBrowserEventEmitter-test.js +++ b/src/renderers/dom/client/__tests__/ReactBrowserEventEmitter-test.js @@ -110,6 +110,22 @@ describe('ReactBrowserEventEmitter', function() { expect(LISTENER.mock.calls.length).toBe(1); }); + it('should not crash ensureScrollValueMonitoring when createEvent returns null', function() { + var originalCreateEvent = document.createEvent; + var mockedCreateEvent = jest.fn().mockImplementation(function() { + return null; + }); + try { + document.createEvent = mockedCreateEvent; + ReactBrowserEventEmitter.injection.injectHasEventPageXY(undefined); + ReactBrowserEventEmitter.ensureScrollValueMonitoring(); + } finally { + document.createEvent = originalCreateEvent; + } + + expect(mockedCreateEvent.mock.calls.length).toBe(1); + }); + it( 'should not invoke handlers if ReactBrowserEventEmitter is disabled', function() {