This directory is for components that have the Content Module as the
uppermost layer they depend on.  They may depend only on the Content
API (content/public) and on lower layers (e.g. base/, net/, ipc/
etc.).

Components that have bits of code that need to live in different
processes (e.g. some code in the browser process, some in the renderer
process, etc.) should separate the code into different subdirectories.
Hence for a component named 'foo' you might end up with a structure
like the following:

components/foo          - DEPS, OWNERS, foo.gypi
components/foo/browser  - code that needs the browser process
components/foo/common   - for e.g. IPC constants and such
components/foo/renderer - code that needs renderer process

These subdirectories should have DEPS files with the relevant
restrictions in place, i.e. only components/*/browser should
be allowed to #include from content/public/browser.

Note that there may also be an 'android' subdir, with a Java source
code structure underneath it where the package name is
org.chromium.components.foo, and with subdirs after 'foo'
to illustrate process, e.g. 'browser' or 'renderer':

components/foo/android/OWNERS, DEPS
components/foo/android/java/src/org/chromium/components/foo/browser/
components/foo/android/javatests/src/org/chromium/components/foo/browser/

Code in a component should be placed in a namespace corresponding to
the name of the component; e.g. for a component living in
//components/foo, code in that component should be in the foo::
namespace. Note that it used to be the rule that all code under
//components should be in the components:: namespace; this is being
phased out.
