JavaScipt and GWT based UI plugin support

Adds support for extending Gerrit's web UI using either pure
JavaScript or GWT compiled with a modified CrossSiteIframeLinker.

To add code to the web UI plugins should bind WebUiPlugin to either
GwtPlugin or JavaScriptPlugin in their plugin's Web-Module. This
tells the UI bootstrap code where to find additional JavaScript to
inject into the page before displaying content.

For a GWT based plugin:

  * com.google.gerrit.client.Plugin class should be extended,
  * inheritance from com.google.gerrit.Plugin should be added
    to gwt.xml,
  * subclass of client.Plugin should be set as entry point,
  * dependency from com.google.gerrit/gerrit-plugin-gwtui should
    be added to pom.xml,
  * webappDirectory option for gwt-maven-plugin should be
    set to ${project.build.directory}/classes/static

For JavaScript based plugins the source code should be put into
the static/ directory of the plugin's JAR file.

Currently there are no extension points for either JS or GWT plugins
to interact with. Some will be added in a future commit. With this
commit only simple modification of the UI is possible, for example
calling window.alert() or adding extra elements to page contents
based on the existing element ids.

Change-Id: I3558991ba4a1477d6cde64eb0a761a7e4c399ec3
Signed-off-by: Dariusz Luksza <dariusz@luksza.org>
This commit is contained in:
Dariusz Luksza
2012-10-10 11:10:09 +02:00
committed by Shawn O. Pearce
parent bc16fa2f3f
commit cd4fc1c239
21 changed files with 793 additions and 39 deletions

View File

@@ -0,0 +1,33 @@
// Copyright (C) 2012 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.extensions.webui;
/** Configures a web UI plugin compiled using GWT. */
public class GwtPlugin extends WebUiPlugin {
private final String moduleName;
/**
* @param moduleName name of GWT module. The resource
* {@code static/$MODULE/$MODULE.nocache.js} will be used.
*/
public GwtPlugin(String moduleName) {
this.moduleName = moduleName;
}
@Override
public String getJavaScriptResourcePath() {
return String.format("static/%s/%s.nocache.js", moduleName, moduleName);
}
}

View File

@@ -0,0 +1,33 @@
// Copyright (C) 2012 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.extensions.webui;
/** Configures a web UI plugin written using JavaScript. */
public class JavaScriptPlugin extends WebUiPlugin {
private final String fileName;
/**
* @param fileName of JavaScript source file under {@code static/}
* subdirectory within the plugin's JAR.
*/
public JavaScriptPlugin(String fileName) {
this.fileName = fileName;
}
@Override
public String getJavaScriptResourcePath() {
return "static/" + fileName;
}
}

View File

@@ -0,0 +1,54 @@
// Copyright (C) 2012 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.extensions.webui;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.inject.Inject;
/**
* Specifies JavaScript to dynamically load into the web UI.
*
* @see GwtPlugin
* @see JavaScriptPlugin
*/
public abstract class WebUiPlugin {
public static final GwtPlugin gwt(String moduleName) {
return new GwtPlugin(moduleName);
}
public static final JavaScriptPlugin js(String scriptName) {
return new JavaScriptPlugin(scriptName);
}
private String pluginName;
/** @return installed name of the plugin that provides this UI feature. */
public final String getPluginName() {
return pluginName;
}
@Inject
void setPluginName(@PluginName String pluginName) {
this.pluginName = pluginName;
}
/** @return path to initialization script within the plugin's JAR. */
public abstract String getJavaScriptResourcePath();
@Override
public String toString() {
return getJavaScriptResourcePath();
}
}