blob: e1bf39e22e0214bcdd6238179bb926a27a6c7e0a [file] [log] [blame]
= Gerrit Code Review - PolyGerrit Plugin Development
CAUTION: Work in progress. Hard hat area. +
This document will be populated with details along with implementation. +
link:https://groups.google.com/d/topic/repo-discuss/vb8WJ4m0hK0/discussion[Join
the discussion.]
[[loading]]
== Plugin loading and initialization
link:https://gerrit-review.googlesource.com/Documentation/js-api.html#_entry_point[Entry
point] for the plugin and the loading method is based on
link:http://w3c.github.io/webcomponents/spec/imports/[HTML Imports] spec.
* The plugin provides index.html, similar to
link:https://gerrit-review.googlesource.com/Documentation/dev-plugins.html#deployment[.js
Web UI plugins]
* index.html contains a `dom-module` tag with a script that uses
`Gerrit.install()`.
* PolyGerrit imports index.html along with all required resources defined in it
(fonts, styles, etc)
* For standalone plugins, the entry point file is a `pluginname.html` file
located in `gerrit-site/plugins` folder, where `pluginname` is an alphanumeric
plugin name.
Here's a sample `myplugin.html`:
``` html
<dom-module id="my-plugin">
<script>
Gerrit.install(function() { console.log('Ready.'); });
</script>
</dom-module>
```
[[low-level-api]]
== Low-level DOM API
Basically, the DOM is the API surface. Low-level API provides methods for
decorating, replacing, and styling DOM elements exposed through a set of
endpoints.
PolyGerrit provides a simple way for accessing the DOM via DOM hooks API. A DOM
hook is a custom element that is instantiated for the plugin endpoint. In the
decoration case, a hook is set with a `content` attribute that points to the DOM
element.
1. Get the DOM hook API instance via `plugin.hook(endpointName)`
2. Set up an `onAttached` callback
3. Callback is called when the hook element is created and inserted into DOM
4. Use element.content to get UI element
``` js
Gerrit.install(function(plugin) {
const domHook = plugin.hook('reply-text');
domHook.onAttached(element => {
if (!element.content) { return; }
// element.content is a reply dialog text area.
});
});
```
[[low-level-decorating]]
=== Decorating DOM Elements
For each endpoint, PolyGerrit provides a list of DOM properties (such as
attributes and events) that are supported in the long-term.
NOTE: TODO: Insert link to the full endpoints API.
``` js
Gerrit.install(function(plugin) {
const domHook = plugin.hook('reply-text');
domHook.onAttached(element => {
if (!element.content) { return; }
element.content.style.border = '1px red dashed';
});
});
```
[[low-level-replacing]]
=== Replacing DOM Elements
An endpoint's contents can be replaced by passing the replace attribute as an
option.
``` js
Gerrit.install(function(plugin) {
const domHook = plugin.hook('header-title', {replace: true});
domHook.onAttached(element => {
element.appendChild(document.createElement('my-site-header'));
});
});
```
[[low-level-style]]
=== Styling DOM Elements
A plugin may provide Polymer's
https://www.polymer-project.org/2.0/docs/devguide/style-shadow-dom#style-modules[style
modules] to style individual endpoints using
`plugin.registerStyleModule(endpointName, moduleName)`. A style must be defined
as a standalone `<dom-module>` defined in the same .html file.
Note: TODO: Insert link to the full styling API.
``` html
<dom-module id="my-plugin">
<script>
Gerrit.install(function(plugin) {
plugin.registerStyleModule('change-metadata', 'some-style-module');
});
</script>
</dom-module>
<dom-module id="some-style-module">
<style>
html {
--change-metadata-label-status: {
display: none;
}
--change-metadata-strategy: {
display: none;
}
}
</style>
</dom-module>
```