From 10e1289697de3e58c02c233fe35d23c519a71096 Mon Sep 17 00:00:00 2001 From: jim Date: Thu, 12 Nov 2015 13:40:25 -0800 Subject: [PATCH] Initial outline for new devtools api --- src/renderers/dom/ReactDOM.js | 3 ++ src/renderers/dom/shared/ReactDOMDevtools.js | 52 ++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 src/renderers/dom/shared/ReactDOMDevtools.js diff --git a/src/renderers/dom/ReactDOM.js b/src/renderers/dom/ReactDOM.js index 069db9c582c01..85cc99c5505da 100644 --- a/src/renderers/dom/ReactDOM.js +++ b/src/renderers/dom/ReactDOM.js @@ -14,6 +14,7 @@ 'use strict'; var ReactDOMComponentTree = require('ReactDOMComponentTree'); +var ReactDOMDevtools = require('ReactDOMDevtools'); var ReactDefaultInjection = require('ReactDefaultInjection'); var ReactMount = require('ReactMount'); var ReactPerf = require('ReactPerf'); @@ -35,6 +36,8 @@ var React = { render: render, unmountComponentAtNode: ReactMount.unmountComponentAtNode, version: ReactVersion, + addDevtool: ReactDOMDevtools.addDevtool, + removeDevtool: ReactDOMDevtools.removeDevtool, /* eslint-disable camelcase */ unstable_batchedUpdates: ReactUpdates.batchedUpdates, diff --git a/src/renderers/dom/shared/ReactDOMDevtools.js b/src/renderers/dom/shared/ReactDOMDevtools.js new file mode 100644 index 0000000000000..d02e1a53959c3 --- /dev/null +++ b/src/renderers/dom/shared/ReactDOMDevtools.js @@ -0,0 +1,52 @@ +/** + * Copyright 2013-2015, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + * @providesModule ReactDOMDevtools + */ + +'use strict'; + +var warning = require('warning'); + +var eventHandlers = []; +var handlerDoesThrowForEvent = {}; + +var ReactDOMDevtools = { + addDevtool(devtool) { + eventHandlers.push(devtool); + }, + + removeDevtool(devtool) { + for (var i = 0; i < eventHandlers.length; i++) { + if (eventHandlers[i] === devtool) { + eventHandlers.splice(i, 1); + i--; + } + } + }, + + emitEvent(eventName, eventData) { + if (__DEV__) { + eventHandlers.forEach(function(handler) { + try { + handler.handleEvent(eventName, eventData); + } catch (e) { + warning( + !handlerDoesThrowForEvent[eventName], + 'exception thrown by devtool while handling %s: %s', + eventName, + e.message + ); + handlerDoesThrowForEvent[eventName] = true; + } + }); + } + }, +}; + +module.exports = ReactDOMDevtools;