Gerrit Code Review - Themes
===========================

Gerrit supports some customization of the HTML it sends to
the browser, allowing organizations to alter the look and
feel of the application to fit with their general scheme.

Configuration can either be sitewide or per-project. Projects without a
specified theme inherit from their parents, or from the sitewide theme
for `All-Projects`.

Sitewide themes are stored in `'$site_path'/etc`, and per-project
themes are stored in `'$site_path'/themes/{project-name}`. Files are
only served from a single theme directory; if you want to modify or
extend an inherited theme, you must copy it into the appropriate
per-project directory.

HTML Header/Footer
------------------

At startup Gerrit reads the following files (if they exist) and
uses them to customize the HTML page it sends to clients:

* `<theme-dir>/GerritSiteHeader.html`
+
HTML is inserted below the menu bar, but above any page content.
This is a good location for an organizational logo, or links to
other systems like bug tracking.

* `<theme-dir>/GerritSiteFooter.html`
+
HTML is inserted at the bottom of the page, below all other content,
but just above the footer rule and the "Powered by Gerrit Code
Review (v....)" message shown at the extreme bottom.

* `<theme-dir>/GerritSite.css`
+
The CSS rules are inlined into the top of the HTML page, inside
of a `<style>` tag.  These rules can be used to support styling
the elements within either the header or the footer.

The *.html files must be valid XHTML, with one root element,
typically a single `<div>` tag.  The server parses it as XML, and
then inserts the root element into the host page.  If a file has
more than one root level element, Gerrit will not start.

Static Images
-------------

Static image files can also be served from `'$site_path'/static`,
and may be referenced in `GerritSite{Header,Footer}.html`
or `GerritSite.css` by the relative URL `static/$name`
(e.g. `static/logo.png`).

To simplify security management, files are only served from
`'$site_path'/static`.  Subdirectories are explicitly forbidden from
being served from this location by enforcing the rule that file names
cannot contain `/` or `\`.  (Client requests for `static/foo/bar`
will result in 404 Not Found responses.)

HTTP Caching
------------

The header, footer, and CSS files are inlined into the host page,
which is always sent with a no-cache header.  Clients will see any
changes immediately after they are made.

Assets under `'$site_path'/static` whose file name matches one of the
following patterns are served with a 1 year expiration, permitting
very aggressive caching by clients and edge-proxies:

 * `*.cache.html`
 * `*.cache.gif`
 * `*.cache.png`
 * `*.cache.css`
 * `*.cache.jar`
 * `*.cache.swf`

All other assets under `'$site_path'/static` are served with a 5
minute expire, permitting some (limited) caching.  It may take up
to 5 minutes after making a change, before clients see the changes.

It is recommended that static images used in the site header
or footer be named with a unique caching file name, for example
`my_logo1.cache.png`, to allow browsers to take advantage of their
disk cache.  If the image needs to be modified, create a new file,
`my_logo2.cache.png` and update the header (or footer) HTML to
reference the new image path.

Google Analytics Integration
----------------------------

To connect Gerrit to Google Analytics add the following to your
`GerritSiteFooter.html`:

====
  <div>
  <!-- standard analytics code -->
    <script type="text/javascript">
      var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
      document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
    </script>
    <script type="text/javascript">
      var pageTracker = _gat._getTracker("UA-nnnnnnn-n");
      pageTracker._trackPageview();
    </script>
  <!-- /standard analytics code -->

  <script type="text/javascript">
    window.onload = function() {
      gerrit_addHistoryHook(function (s) {
        pageTracker._trackPageview(s.replace(/#/, '/'))
      });
    };
  </script>
  </div>
====

Please consult the Google Analytics documentation for the correct
setup code (the first two script tags).  The above is shown only
as a reference example.

If your footer is otherwise empty, wrap all of the script tags into
a single `<div>` tag (like above) to ensure it is a well-formed
XHTML document file.

The global function `gerrit_addHistoryHook` accepts functions that
accept a string parameter.  These functions are put into a list and
invoked any time Gerrit shifts URLs.  You'll see page names like
`/#change,123` be passed to these functions, which in turn
are handed off to Google Analytics for tracking.  Our example hook
above replaces '#' with '/' because Analytics won't track anchors.

The `window.onload` callback is necessary to ensure that the
`gerrit_addHistoryHook` function has actually been defined by the
page.  Because GWT loads the module asynchronously any `<script>`
block in the header or footer will execute before Gerrit has defined
the function and is ready to register the hook callback.

GERRIT
------
Part of link:index.html[Gerrit Code Review]
