From b0757c51828fc95ad88505fbebebcfdb3f631994 Mon Sep 17 00:00:00 2001 From: Ben Alpert Date: Wed, 12 Feb 2014 23:21:07 -0800 Subject: [PATCH] Assert that event listeners are real functions Fixes #1028. --- src/browser/dom/components/LinkedValueUtils.js | 5 ++++- src/event/EventPluginHub.js | 5 +++++ src/event/__tests__/EventPluginHub-test.js | 8 ++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/browser/dom/components/LinkedValueUtils.js b/src/browser/dom/components/LinkedValueUtils.js index 191d4eebe7..17e1256ea2 100644 --- a/src/browser/dom/components/LinkedValueUtils.js +++ b/src/browser/dom/components/LinkedValueUtils.js @@ -19,6 +19,8 @@ "use strict"; +var ReactPropTypes = require('ReactPropTypes'); + var invariant = require('invariant'); var hasReadOnlyValue = { @@ -106,7 +108,8 @@ var LinkedValueUtils = { ); } } - } + }, + onChange: ReactPropTypes.func } }, diff --git a/src/event/EventPluginHub.js b/src/event/EventPluginHub.js index d6f214b239..089a7be552 100644 --- a/src/event/EventPluginHub.js +++ b/src/event/EventPluginHub.js @@ -155,6 +155,11 @@ var EventPluginHub = { ExecutionEnvironment.canUseDOM, 'Cannot call putListener() in a non-DOM environment.' ); + invariant( + !listener || typeof listener === 'function', + 'Expected %s listener to be a function, instead got type %s', + registrationName, typeof listener + ); if (__DEV__) { // IE8 has no API for event capturing and the `onScroll` event doesn't diff --git a/src/event/__tests__/EventPluginHub-test.js b/src/event/__tests__/EventPluginHub-test.js index 280e79728e..9e546ab92a 100644 --- a/src/event/__tests__/EventPluginHub-test.js +++ b/src/event/__tests__/EventPluginHub-test.js @@ -42,4 +42,12 @@ describe('EventPluginHub', function() { ); }); + it("should prevent non-function listeners", function() { + expect(function() { + EventPluginHub.putListener(1, 'onClick', 'not a function'); + }).toThrow( + 'Invariant Violation: Expected onClick listener to be a function, ' + + 'instead got type string' + ); + }); });