= The Care and Feeding of WebCore Modules = This document describes how WebCore's module system works and how to use it when building a new feature. == Overview == As we add more features to WebCore, the project becomes more complex. Some self-contained features, like IndexedDB and MediaStream, expose DOM interfaces but aren't otherwise involved in the core functionality of the engine, such as layout and rendering. The module system let us reduce the complexity of the project by loosening the coupling of between these features and the rest of WebCore. == Dependency diagram == The code for a module belongs in a subdirectory of the [http://trac.webkit.org/browser/trunk/Source/WebCore/Modules/ Modules] directory and in a subdirectory of [http://trac.webkit.org/browser/trunk/Source/WebCore/platform/ WebCore/platform]. For example, the MediaStream module is contained in http://trac.webkit.org/browser/trunk/Source/WebCore/Modules/mediastream and http://trac.webkit.org/browser/trunk/Source/WebCore/platform/mediastream. Keeping the code for your feature in a single directory reduces the burden that your feature places on other WebKit contributors as they develop other modules and core functionality of the engine. This [https://docs.google.com/drawings/d/10WlCj2J3arxf4cDGRKteNinaP755iFnmYtYtnNSCQOY/edit?authkey=CP6plYAI dependency diagram] shows how the WebAudio, MediaStream, and IndexedDB modules fit into the WebKit's dependency diagram. Notice, in particular, that WebCore proper should not have dependencies on your module. == Associating JavaScript APIs with "core" objects == Even self-contained features often need to expose JavaScript APIs on "catch-all" interfaces like DOMWindow or Navigator. If we declared these APIs in DOMWindow.idl and implemented them in DOMWindow.h/cpp, the complexity of DOMWindow would increase with each added feature. To avoid complexity creep in these core classes, you can declare your JavaScript API in supplemental IDL files, mirroring the "partial interface" WebIDL mechanism used in specifications. For more details, see the [http://trac.webkit.org/wiki/WebKitIDL#Supplemental documentation of the Supplemental attribute]. The MediaStream module [http://trac.webkit.org/browser/trunk/Source/WebCore/Modules/mediastream/NavigatorMediaStream.idl uses this mechanism] to add the webkitGetUserMedia API to Navigator. The API is implemented in [http://trac.webkit.org/browser/trunk/Source/WebCore/Modules/mediastream/NavigatorMediaStream.cpp NavigatorMediaStream.cpp], avoiding bloat in Navigator.cpp itself. == Associating state with "core" objects == * http://trac.webkit.org/browser/trunk/Source/WebCore/platform/Supplementable.h == Observing the lifecycle of "core" objects == * http://trac.webkit.org/browser/trunk/Source/WebCore/page/FrameDestructionObserver.h * http://trac.webkit.org/browser/trunk/Source/WebCore/dom/ContextDestructionObserver.h * http://trac.webkit.org/browser/trunk/Source/WebCore/dom/ActiveDOMObject.h == Adding new events and exceptions == * http://trac.webkit.org/browser/trunk/Source/WebCore/dom/EventNames.in * http://trac.webkit.org/browser/trunk/Source/WebCore/dom/DOMExceptions.in