react / react-0.13.3 / examples / basic-commonjs / node_modules / react / lib / EventPluginRegistry.js
81143 views/**1* Copyright 2013-2015, Facebook, Inc.2* All rights reserved.3*4* This source code is licensed under the BSD-style license found in the5* LICENSE file in the root directory of this source tree. An additional grant6* of patent rights can be found in the PATENTS file in the same directory.7*8* @providesModule EventPluginRegistry9* @typechecks static-only10*/1112'use strict';1314var invariant = require("./invariant");1516/**17* Injectable ordering of event plugins.18*/19var EventPluginOrder = null;2021/**22* Injectable mapping from names to event plugin modules.23*/24var namesToPlugins = {};2526/**27* Recomputes the plugin list using the injected plugins and plugin ordering.28*29* @private30*/31function recomputePluginOrdering() {32if (!EventPluginOrder) {33// Wait until an `EventPluginOrder` is injected.34return;35}36for (var pluginName in namesToPlugins) {37var PluginModule = namesToPlugins[pluginName];38var pluginIndex = EventPluginOrder.indexOf(pluginName);39("production" !== process.env.NODE_ENV ? invariant(40pluginIndex > -1,41'EventPluginRegistry: Cannot inject event plugins that do not exist in ' +42'the plugin ordering, `%s`.',43pluginName44) : invariant(pluginIndex > -1));45if (EventPluginRegistry.plugins[pluginIndex]) {46continue;47}48("production" !== process.env.NODE_ENV ? invariant(49PluginModule.extractEvents,50'EventPluginRegistry: Event plugins must implement an `extractEvents` ' +51'method, but `%s` does not.',52pluginName53) : invariant(PluginModule.extractEvents));54EventPluginRegistry.plugins[pluginIndex] = PluginModule;55var publishedEvents = PluginModule.eventTypes;56for (var eventName in publishedEvents) {57("production" !== process.env.NODE_ENV ? invariant(58publishEventForPlugin(59publishedEvents[eventName],60PluginModule,61eventName62),63'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.',64eventName,65pluginName66) : invariant(publishEventForPlugin(67publishedEvents[eventName],68PluginModule,69eventName70)));71}72}73}7475/**76* Publishes an event so that it can be dispatched by the supplied plugin.77*78* @param {object} dispatchConfig Dispatch configuration for the event.79* @param {object} PluginModule Plugin publishing the event.80* @return {boolean} True if the event was successfully published.81* @private82*/83function publishEventForPlugin(dispatchConfig, PluginModule, eventName) {84("production" !== process.env.NODE_ENV ? invariant(85!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName),86'EventPluginHub: More than one plugin attempted to publish the same ' +87'event name, `%s`.',88eventName89) : invariant(!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName)));90EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig;9192var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;93if (phasedRegistrationNames) {94for (var phaseName in phasedRegistrationNames) {95if (phasedRegistrationNames.hasOwnProperty(phaseName)) {96var phasedRegistrationName = phasedRegistrationNames[phaseName];97publishRegistrationName(98phasedRegistrationName,99PluginModule,100eventName101);102}103}104return true;105} else if (dispatchConfig.registrationName) {106publishRegistrationName(107dispatchConfig.registrationName,108PluginModule,109eventName110);111return true;112}113return false;114}115116/**117* Publishes a registration name that is used to identify dispatched events and118* can be used with `EventPluginHub.putListener` to register listeners.119*120* @param {string} registrationName Registration name to add.121* @param {object} PluginModule Plugin publishing the event.122* @private123*/124function publishRegistrationName(registrationName, PluginModule, eventName) {125("production" !== process.env.NODE_ENV ? invariant(126!EventPluginRegistry.registrationNameModules[registrationName],127'EventPluginHub: More than one plugin attempted to publish the same ' +128'registration name, `%s`.',129registrationName130) : invariant(!EventPluginRegistry.registrationNameModules[registrationName]));131EventPluginRegistry.registrationNameModules[registrationName] = PluginModule;132EventPluginRegistry.registrationNameDependencies[registrationName] =133PluginModule.eventTypes[eventName].dependencies;134}135136/**137* Registers plugins so that they can extract and dispatch events.138*139* @see {EventPluginHub}140*/141var EventPluginRegistry = {142143/**144* Ordered list of injected plugins.145*/146plugins: [],147148/**149* Mapping from event name to dispatch config150*/151eventNameDispatchConfigs: {},152153/**154* Mapping from registration name to plugin module155*/156registrationNameModules: {},157158/**159* Mapping from registration name to event name160*/161registrationNameDependencies: {},162163/**164* Injects an ordering of plugins (by plugin name). This allows the ordering165* to be decoupled from injection of the actual plugins so that ordering is166* always deterministic regardless of packaging, on-the-fly injection, etc.167*168* @param {array} InjectedEventPluginOrder169* @internal170* @see {EventPluginHub.injection.injectEventPluginOrder}171*/172injectEventPluginOrder: function(InjectedEventPluginOrder) {173("production" !== process.env.NODE_ENV ? invariant(174!EventPluginOrder,175'EventPluginRegistry: Cannot inject event plugin ordering more than ' +176'once. You are likely trying to load more than one copy of React.'177) : invariant(!EventPluginOrder));178// Clone the ordering so it cannot be dynamically mutated.179EventPluginOrder = Array.prototype.slice.call(InjectedEventPluginOrder);180recomputePluginOrdering();181},182183/**184* Injects plugins to be used by `EventPluginHub`. The plugin names must be185* in the ordering injected by `injectEventPluginOrder`.186*187* Plugins can be injected as part of page initialization or on-the-fly.188*189* @param {object} injectedNamesToPlugins Map from names to plugin modules.190* @internal191* @see {EventPluginHub.injection.injectEventPluginsByName}192*/193injectEventPluginsByName: function(injectedNamesToPlugins) {194var isOrderingDirty = false;195for (var pluginName in injectedNamesToPlugins) {196if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {197continue;198}199var PluginModule = injectedNamesToPlugins[pluginName];200if (!namesToPlugins.hasOwnProperty(pluginName) ||201namesToPlugins[pluginName] !== PluginModule) {202("production" !== process.env.NODE_ENV ? invariant(203!namesToPlugins[pluginName],204'EventPluginRegistry: Cannot inject two different event plugins ' +205'using the same name, `%s`.',206pluginName207) : invariant(!namesToPlugins[pluginName]));208namesToPlugins[pluginName] = PluginModule;209isOrderingDirty = true;210}211}212if (isOrderingDirty) {213recomputePluginOrdering();214}215},216217/**218* Looks up the plugin for the supplied event.219*220* @param {object} event A synthetic event.221* @return {?object} The plugin that created the supplied event.222* @internal223*/224getPluginModuleForEvent: function(event) {225var dispatchConfig = event.dispatchConfig;226if (dispatchConfig.registrationName) {227return EventPluginRegistry.registrationNameModules[228dispatchConfig.registrationName229] || null;230}231for (var phase in dispatchConfig.phasedRegistrationNames) {232if (!dispatchConfig.phasedRegistrationNames.hasOwnProperty(phase)) {233continue;234}235var PluginModule = EventPluginRegistry.registrationNameModules[236dispatchConfig.phasedRegistrationNames[phase]237];238if (PluginModule) {239return PluginModule;240}241}242return null;243},244245/**246* Exposed for unit testing.247* @private248*/249_resetEventPlugins: function() {250EventPluginOrder = null;251for (var pluginName in namesToPlugins) {252if (namesToPlugins.hasOwnProperty(pluginName)) {253delete namesToPlugins[pluginName];254}255}256EventPluginRegistry.plugins.length = 0;257258var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs;259for (var eventName in eventNameDispatchConfigs) {260if (eventNameDispatchConfigs.hasOwnProperty(eventName)) {261delete eventNameDispatchConfigs[eventName];262}263}264265var registrationNameModules = EventPluginRegistry.registrationNameModules;266for (var registrationName in registrationNameModules) {267if (registrationNameModules.hasOwnProperty(registrationName)) {268delete registrationNameModules[registrationName];269}270}271}272273};274275module.exports = EventPluginRegistry;276277278