= 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.

== HTML Header/Footer and CSS for login screens

The HTML header, footer, and CSS may be customized for login screens (LDAP,
OAuth, OpenId) and the internally managed Gitweb servlet. See
link:pg-plugin-dev.html[JavaScript Plugin Development and API] for documentation
on modifying styles for the rest of Gerrit (not login screens).

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

* `etc/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.

* `etc/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.

* `etc/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`.  For example, `GerritSiteHeader.html` may
display a company logo like so:

```
<div>
  <img src="/static/logo.png" alt="Our Cool Logo" />
</div>
```

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>
  be <!-- /standard analytics code -->

  <script type="text/javascript">
    window.onload = function() {
      var p = window.location.pathname;
      Gerrit.on('history', function (s) {
        pageTracker._trackPageview(p + '/' + s)
      });
    };
  </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.on("history")` 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
`/c/123` be passed to these functions, which in turn are handed off
to Google Analytics for tracking.  Our example hook above uses '/'
instead of '#' because Analytics won't track anchors.

The `window.onload` callback is necessary to ensure that the
`Gerrit.on()` function has actually been defined by the
page.

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

SEARCHBOX
---------
