Skip to content

Commit 6440569

Browse files
authored
Migrate from EE 8 to EE 9 (#393)
1 parent 0f00735 commit 6440569

File tree

6 files changed

+20
-20
lines changed

6 files changed

+20
-20
lines changed

src/main/java/io/jenkins/plugins/designlibrary/Links.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import hudson.Extension;
44
import jenkins.model.ModelObjectWithChildren;
55
import jenkins.model.ModelObjectWithContextMenu;
6-
import org.kohsuke.stapler.StaplerRequest;
7-
import org.kohsuke.stapler.StaplerResponse;
6+
import org.kohsuke.stapler.StaplerRequest2;
7+
import org.kohsuke.stapler.StaplerResponse2;
88

99
/**
1010
* @author Kohsuke Kawaguchi
@@ -29,7 +29,7 @@ public Category getCategory() {
2929
/**
3030
* This method is called via AJAX to obtain the context menu for this model object.
3131
*/
32-
public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
32+
public ContextMenu doContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
3333
if (false) {
3434
// this implementation is suffice for most ModelObjects. It uses sidepanel.jelly/.groovy to
3535
// generate the context menu
@@ -49,7 +49,7 @@ public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse respons
4949
}
5050
}
5151

52-
public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
52+
public ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
5353
// You implement this method in much the same way you do doContextMenu
5454
return new ContextMenu()
5555
.add("https://yahoo.com/", "Yahoo")

src/main/resources/io/jenkins/plugins/designlibrary/JavaScriptProxy/index.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ invokingMethod.description.1=As you can see above, one can invoke methods on the
1616
invokingMethod.description.2=If the Java method returns an object value (such as <code>int, String, Collection, Object[], JSONObject</code>, etc.), \
1717
you can use the <code>responseObject()</code> method to evaluate the response into a JavaScript object and use it. \
1818
If the Java method renders more complex HTTP response (for example by writing directly to \
19-
<code>StaplerResponse</code> or returning an <code>HttpResponse</code>), JavaScript can use other <code>Ajax.Response</code> methods to access the full HTTP response.
19+
<code>StaplerResponse2</code> or returning an <code>HttpResponse</code>), JavaScript can use other <code>Ajax.Response</code> methods to access the full HTTP response.
2020
invokingMethod.description.3=The method call uses <code>XmlHttpRequest</code> underneath, \
2121
and it gets eventually routed to the corresponding method call on the exact instance that was exported.
2222
tips=Tips
2323
tips.description.1=Parameters of the server Java method.
2424
tips.description.1.body=The Java method can define arbitrary number of parameters for JavaScript. \
25-
Each parameter is converted from JSON to Java via <code>StaplerRequest.bindJSON</code>, \
25+
Each parameter is converted from JSON to Java via <code>StaplerRequest2.bindJSON</code>, \
2626
so aside from primitive Java data types and typeless <code>JSONObject</code> / <code>JSONArray</code>, \
2727
you can use Stapler databinding to accept typed structured data.
2828
tips.description.1.more=After defining the parameters from JavaScript, you can additionally define parameters that are \
29-
injectable by Stapler, such as <code>StaplerRequest</code> or <code>StaplerResponse</code>.
29+
injectable by Stapler, such as <code>StaplerRequest2</code> or <code>StaplerResponse2</code>.
3030
tips.description.2=Exporting null
3131
tips.description.2.body=If the value attribute of a <code>st:bind</code> tag evaluates to \
3232
<code>null</code>, then the corresponding JavaScript proxy will be <code>null</code>.

src/main/resources/io/jenkins/plugins/designlibrary/JavaScriptProxy/index_fr.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ description.2=Pour exposer une m\u00e9thode d''une classe Java \u00e0 un proxy J
33
description.3=Ensuite, \u00e0 partir des scripts Jelly, utilisez la balise <code>st:bind</code> pour exporter un objet Java dans un proxy. L''attribut "value" est \u00e9valu\u00e9 vers un objet Java c\u00f4t\u00e9 serveur \u00e0 exporter, et la balise produit une expression JavaScript qui cr\u00e9e un proxy. Dans l''exemple ci-dessous, nous faisons semblant que l''expression <a href="https://commons.apache.org/proper/commons-jexl/">JEXL</a> est \u00e9valu\u00e9e \u00e0 une certaine instance de Foo.
44
invokingMethod=Invocation de la m\u00e9thode
55
invokingMethod.description.1=Comme vous pouvez le voir ci-dessus, on peut appeler des m\u00e9thodes sur le proxy cr\u00e9\u00e9es par la balise <code>st:bind</code> . La m\u00e9thode JavaScript prend les arguments que prend la m\u00e9thode Java, et elle peut de fa\u00e7on optionnelle prendre une fonction en tant que param\u00e8tre suppl\u00e9mentaire. Cette derni\u00e8re est utilis\u00e9e comme m\u00e9thode de callback lorsque la valeur retourn\u00e9e est disponible. La m\u00e9thode callback re\u00e7oit un objet Ajax.Response.
6-
invokingMethod.description.2=Si la m\u00e9thode Java retourne une valeur d''objet (comme <code>int, String, Collection, Object[], JSONObject</code>, etc.) , vous pouvez utiliser la m\u00e9thode <code>responseObject()</code> pour \u00e9valuer la r\u00e9ponse dans un objet JavaScript et l''utiliser. Si la m\u00e9thode Java retourne une r\u00e9ponse HTTP plus complexe (par exemple en \u00e9crivant directement dans <code>StaplerResponse</code> ou en renvoyant un <code>HttpResponse</code>), JavaScript peut utiliser d''autres m\u00e9thodes <code>Ajax.Response</code> pour acc\u00e9der \u00e0 la r\u00e9ponse HTTP compl\u00e8te.
6+
invokingMethod.description.2=Si la m\u00e9thode Java retourne une valeur d''objet (comme <code>int, String, Collection, Object[], JSONObject</code>, etc.) , vous pouvez utiliser la m\u00e9thode <code>responseObject()</code> pour \u00e9valuer la r\u00e9ponse dans un objet JavaScript et l''utiliser. Si la m\u00e9thode Java retourne une r\u00e9ponse HTTP plus complexe (par exemple en \u00e9crivant directement dans <code>StaplerResponse2</code> ou en renvoyant un <code>HttpResponse</code>), JavaScript peut utiliser d''autres m\u00e9thodes <code>Ajax.Response</code> pour acc\u00e9der \u00e0 la r\u00e9ponse HTTP compl\u00e8te.
77
invokingMethod.description.3=L''appel \u00e0 la m\u00e9thode utilise <code>XmlHttpRequest</code> par derri\u00e8re, et cet appel est finalement rout\u00e9 vers l''appel de m\u00e9thode correspondant sur l''instance exacte qui a \u00e9t\u00e9 export\u00e9e.
88
tips=Astuces
99
tips.description.1=Param\u00e8tres de la m\u00e9thode Java c\u00f4t\u00e9 serveur
10-
tips.description.1.body=La m\u00e9thode Java peut d\u00e9finir un nombre arbitraire de param\u00e8tres pour JavaScript. Chaque param\u00e8tre est converti depuis JSON vers Java via <code>StaplerRequest.bindJSON</code>, donc en plus des types de donn\u00e9es Java primitifs et de <code>JSONObject</code>/<code>JSONArray</code> non typ\u00e9s, vous pouvez utiliser le couplage de donn\u00e9es Stapler pour accepter les donn\u00e9es structur\u00e9es typ\u00e9es.
11-
tips.description.1.more=Apr\u00e8s avoir d\u00e9fini les param\u00e8tres de JavaScript, vous pouvez \u00e9galement d\u00e9finir des param\u00e8tres qui sont injectables par Stapler, comme <code>StaplerRequest</code> ou <code>StaplerResponse</code>.
10+
tips.description.1.body=La m\u00e9thode Java peut d\u00e9finir un nombre arbitraire de param\u00e8tres pour JavaScript. Chaque param\u00e8tre est converti depuis JSON vers Java via <code>StaplerRequest2.bindJSON</code>, donc en plus des types de donn\u00e9es Java primitifs et de <code>JSONObject</code>/<code>JSONArray</code> non typ\u00e9s, vous pouvez utiliser le couplage de donn\u00e9es Stapler pour accepter les donn\u00e9es structur\u00e9es typ\u00e9es.
11+
tips.description.1.more=Apr\u00e8s avoir d\u00e9fini les param\u00e8tres de JavaScript, vous pouvez \u00e9galement d\u00e9finir des param\u00e8tres qui sont injectables par Stapler, comme <code>StaplerRequest2</code> ou <code>StaplerResponse2</code>.
1212
tips.description.2=Exportation de null
1313
tips.description.2.body=Si l''attribut value d''une balise &lt;st:bind&gt; est \u00e9valu\u00e9 \u00e0 <code>null</code>, alors le proxy JavaScript correspondant sera <code>null</code>.

src/main/resources/io/jenkins/plugins/designlibrary/JavaScriptProxy/index_pt.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ description.2=Para expor um m\u00e9todo de uma classe Java a um procurador JavaS
33
description.3=Ent\u00e3o a partir de scripts do Jelly, use a etiqueta <code>st:bind</code> para exportar um objeto Java para um procurador. O atributo "valor" \u00e9 avaliado para um objeto Java do lado do servidor a ser exportado e a etiqueta produz uma express\u00e3o JavaScript que cria um procurador. No exemplo abaixo, estamos fingindo que a express\u00e3o <a href="https://commons.apache.org/proper/commons-jexl/">JEXL</a> avalia alguma inst\u00e2ncia de Foo.
44
invokingMethod=M\u00e9todo de chamada
55
invokingMethod.description.1=Como voc\u00ea pode ver acima, pode-se invocar m\u00e9todos no procurador criado pela etiqueta <code>st:bind</code>. O m\u00e9todo JavaScript utiliza os argumentos que o m\u00e9todo Java recebe, ent\u00e3o ele pode opcionalmente aceitar uma fun\u00e7\u00e3o como par\u00e2metro adicional, cujo o qual \u00e9 usado como m\u00e9todo de chamada de retorno quando o valor de retorno estiver dispon\u00edvel. O m\u00e9todo de chamada de retorno recebe um objeto Ajax.Response.
6-
invokingMethod.description.2=Se o m\u00e9todo Java retorna um valor de objeto (como <code>int, String, Collection, Object[], JSONObject</code>, etc.), voc\u00ea pode usar o m\u00e9todo <code>responseObject()</code> para avaliar a resposta em um objeto JavaScript e us\u00e1-lo. Se o m\u00e9todo Java renderizar uma resposta HTTP mais complexa (por exemplo, escrevendo diretamente para <code>StaplerResponse</code> ou retornando um <code>HttpResponse</code>), o JavaScript pode usar outros m\u00e9todos do <code>Ajax.Response</code> para acessar a resposta HTTP completa.
6+
invokingMethod.description.2=Se o m\u00e9todo Java retorna um valor de objeto (como <code>int, String, Collection, Object[], JSONObject</code>, etc.), voc\u00ea pode usar o m\u00e9todo <code>responseObject()</code> para avaliar a resposta em um objeto JavaScript e us\u00e1-lo. Se o m\u00e9todo Java renderizar uma resposta HTTP mais complexa (por exemplo, escrevendo diretamente para <code>StaplerResponse2</code> ou retornando um <code>HttpResponse</code>), o JavaScript pode usar outros m\u00e9todos do <code>Ajax.Response</code> para acessar a resposta HTTP completa.
77
invokingMethod.description.3=O m\u00e9todo de chamada usa <code>XmlHttpRequest</code> nos bastidores e \u00e9 eventualmente encaminhado para a chamada do m\u00e9todo correspondente na inst\u00e2ncia exata exportada.
88
tips=Dicas
99
tips.description.1=Par\u00e2metros do m\u00e9todo do servidor Java
10-
tips.description.1.body=O m\u00e9todo Java pode definir um n\u00famero arbitr\u00e1rio de par\u00e2metros para o JavaScript. Cada par\u00e2metro \u00e9 convertido do JSON para Java atrav\u00e9s do <code>StaplerRequest.bindJSON</code>, ent\u00e3o al\u00e9m dos tipos de dados primitivos do Java e <code>JSONObject</code> / <code>JSONArray</code> sem tipagem, voc\u00ea pode usar a amarra\u00e7\u00e3o de dados do Stapler para aceitar dados tipados estruturados.
11-
tips.description.1.more=Ap\u00f3s definir os par\u00e2metros do JavaScript voc\u00ea pode adicionalmente definir par\u00e2metros injet\u00e1veis pelo Stapler, como <code>StaplerRequest</code> ou <code>StaplerResponse</code>.
10+
tips.description.1.body=O m\u00e9todo Java pode definir um n\u00famero arbitr\u00e1rio de par\u00e2metros para o JavaScript. Cada par\u00e2metro \u00e9 convertido do JSON para Java atrav\u00e9s do <code>StaplerRequest2.bindJSON</code>, ent\u00e3o al\u00e9m dos tipos de dados primitivos do Java e <code>JSONObject</code> / <code>JSONArray</code> sem tipagem, voc\u00ea pode usar a amarra\u00e7\u00e3o de dados do Stapler para aceitar dados tipados estruturados.
11+
tips.description.1.more=Ap\u00f3s definir os par\u00e2metros do JavaScript voc\u00ea pode adicionalmente definir par\u00e2metros injet\u00e1veis pelo Stapler, como <code>StaplerRequest2</code> ou <code>StaplerResponse2</code>.
1212
tips.description.2=Exportando nulo
1313
tips.description.2.body=Se o atributo valor de uma etiqueta &lt;st:bind&gt; for avaliado como <code>null</code>, ent\u00e3o o procurador JavaScript correspondente ser\u00e1 <code>null</code>.

src/main/resources/io/jenkins/plugins/designlibrary/JavaScriptProxy/index_zh.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ description.2=\u82e5\u8981\u5728 JavaScript \u4ee3\u7406\u4e2d\u66b4\u9732\u4e00
33
description.3=\u7136\u540e\u4ece Jelly \u811a\u672c\uff0c\u4f7f\u7528 <code>st:bind</code> \u6807\u7b7e\u5bfc\u51fa\u4e00\u4e2a Java \u5bf9\u8c61\u5230\u4ee3\u7406\u5bf9\u8c61\u3002 "value"\u5c5e\u6027\u8bc4\u4f30\u5230\u8981\u5bfc\u51fa\u7684\u670d\u52a1\u5668\u7aefJava \u5bf9\u8c61\uff0c\u6807\u7b7e\u4ea7\u751f\u4e86\u4e00\u4e2a\u521b\u5efa\u4ee3\u7406\u7684JavaScript\u8868\u8fbe\u5f0f\u3002 \u5728\u4e0b\u9762\u7684\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u5047\u88c5 <a href="https://commons.apache.org/proper/commons-jexl/">JEXL</a> \u8868\u8fbe\u5f0f\u5bf9\u4e00\u4e9bFoo\u5b9e\u4f8b\u8fdb\u884c\u4e86\u8bc4\u4ef7\u3002
44
invokingMethod=\u8c03\u7528\u65b9\u5f0f
55
invokingMethod.description.1=\u6b63\u5982\u60a8\u53ef\u4ee5\u5728\u4e0a\u9762\u770b\u5230\u7684\u90a3\u6837\uff0c\u4eba\u4eec\u53ef\u4ee5\u5728 <code>st:bind</code> \u6807\u7b7e\u6240\u521b\u5efa\u7684\u4ee3\u7406\u4e0a\u8c03\u7528\u65b9\u6cd5\u3002 JavaScript \u65b9\u6cd5\u91c7\u7528\u4e86\u8ba4\u4e3aJava \u65b9\u6cd5\u7684\u53c2\u6570\uff0c\u7136\u540e\u5b83\u53ef\u4ee5\u5c06\u4e00\u4e2a\u51fd\u6570\u4f5c\u4e3a\u4e00\u4e2a\u989d\u5916\u53c2\u6570\uff0c \u5f53\u8fd4\u56de\u503c\u53ef\u7528\u65f6\uff0c\u5b83\u7528\u4f5c\u56de\u8c03\u65b9\u5f0f\u3002 \u56de\u8c03\u65b9\u6cd5\u63a5\u6536\u4e00\u4e2a Ajax.response \u5bf9\u8c61\u3002
6-
invokingMethod.description.2=\u5982\u679cJava \u65b9\u6cd5\u8fd4\u56de\u5bf9\u8c61\u503c (\u5982 <code>int\u3001String\u3001Collection\u3001Object[]\u3001JSONObject</code>\u7b49) \uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528 <code>responseObject()</code> \u65b9\u6cd5\u6765\u8bc4\u4f30\u5bf9JavaScript \u5bf9\u8c61\u7684\u53cd\u5e94\u5e76\u4f7f\u7528\u5b83\u3002 \u5982\u679cJava \u65b9\u6cd5\u8868\u73b0\u66f4\u590d\u6742\u7684 HTTP \u53cd\u5e94(\u4f8b\u5982\u76f4\u63a5\u5199\u5165 <code>StaplerResponse</code> \u6216\u9001\u56de <code>HttpResponse</code>), JavaScript \u53ef\u4ee5\u4f7f\u7528\u5176\u4ed6 <code>Ajax. esponse</code> \u65b9\u6cd5\u5b58\u53d6\u5b8c\u6574\u7684 HTTP \u53cd\u5e94\u3002
6+
invokingMethod.description.2=\u5982\u679cJava \u65b9\u6cd5\u8fd4\u56de\u5bf9\u8c61\u503c (\u5982 <code>int\u3001String\u3001Collection\u3001Object[]\u3001JSONObject</code>\u7b49) \uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528 <code>responseObject()</code> \u65b9\u6cd5\u6765\u8bc4\u4f30\u5bf9JavaScript \u5bf9\u8c61\u7684\u53cd\u5e94\u5e76\u4f7f\u7528\u5b83\u3002 \u5982\u679cJava \u65b9\u6cd5\u8868\u73b0\u66f4\u590d\u6742\u7684 HTTP \u53cd\u5e94(\u4f8b\u5982\u76f4\u63a5\u5199\u5165 <code>StaplerResponse2</code> \u6216\u9001\u56de <code>HttpResponse</code>), JavaScript \u53ef\u4ee5\u4f7f\u7528\u5176\u4ed6 <code>Ajax. esponse</code> \u65b9\u6cd5\u5b58\u53d6\u5b8c\u6574\u7684 HTTP \u53cd\u5e94\u3002
77
invokingMethod.description.3=\u65b9\u6cd5\u8c03\u7528\u4f7f\u7528 <code>XmlHttpRequest</code> \u4e0b\u9762\uff0c\u5b83\u6700\u7ec8\u88ab\u5b9a\u8def\u7ebf\u7531\u5230\u76f8\u5e94\u7684\u65b9\u6cd5\u8c03\u7528\u5230\u5df2\u8f93\u51fa\u7684\u786e\u5207\u5b9e\u4f8b\u4e0a\u3002
88
tips=\u63d0\u793a
99
tips.description.1=\u670d\u52a1\u5668 Java \u65b9\u6cd5\u7684\u53c2\u6570
10-
tips.description.1.body=Java \u65b9\u6cd5\u53ef\u4ee5\u5b9a\u4e49JavaScript\u7684\u4efb\u610f\u6570\u91cf\u7684\u53c2\u6570\u3002\u6bcf\u4e2a\u53c2\u6570\u90fd\u4f7f\u7528\n <code>StaplerRequest.bindJSON</code>\u7531 JSON \u8f6c\u6362\u5230 Java, \u9664\u539f\u59cb\u7684 Java \u6570\u636e\u7c7b\u578b\u548c\u65e0\u7c7b\u578b <code>JSONObject</code> / <code>JSONArray</code>, \u60a8\u53ef\u4ee5\u4f7f\u7528 Stapler \u6570\u636e\u7ed1\u5b9a\u6765\u63a5\u53d7\u8f93\u5165\u7684\u7ed3\u6784\u5316\u6570\u636e\u3002
11-
tips.description.1.more=\u5b9a\u4e49\u6765\u81eaJavaScript\u7684\u53c2\u6570\u540e\uff0c\u60a8\u53ef\u4ee5\u53e6\u5916\u5b9a\u4e49Stapler\u53ef\u4ee5\u6ce8\u5165\u7684\u53c2\u6570\u3002 \u4f8b\u5982 <code>StaplerRequest</code> \u6216 <code>StaplerResponse</code>\u3002
10+
tips.description.1.body=Java \u65b9\u6cd5\u53ef\u4ee5\u5b9a\u4e49JavaScript\u7684\u4efb\u610f\u6570\u91cf\u7684\u53c2\u6570\u3002\u6bcf\u4e2a\u53c2\u6570\u90fd\u4f7f\u7528\n <code>StaplerRequest2.bindJSON</code>\u7531 JSON \u8f6c\u6362\u5230 Java, \u9664\u539f\u59cb\u7684 Java \u6570\u636e\u7c7b\u578b\u548c\u65e0\u7c7b\u578b <code>JSONObject</code> / <code>JSONArray</code>, \u60a8\u53ef\u4ee5\u4f7f\u7528 Stapler \u6570\u636e\u7ed1\u5b9a\u6765\u63a5\u53d7\u8f93\u5165\u7684\u7ed3\u6784\u5316\u6570\u636e\u3002
11+
tips.description.1.more=\u5b9a\u4e49\u6765\u81eaJavaScript\u7684\u53c2\u6570\u540e\uff0c\u60a8\u53ef\u4ee5\u53e6\u5916\u5b9a\u4e49Stapler\u53ef\u4ee5\u6ce8\u5165\u7684\u53c2\u6570\u3002 \u4f8b\u5982 <code>StaplerRequest2</code> \u6216 <code>StaplerResponse2</code>\u3002
1212
tips.description.2=\u6b63\u5728\u8f93\u51fanull
1313
tips.description.2.body=\u5982\u679c\u4e00\u4e2a &lt;st:bind&gt; \u6807\u7b7e\u7684\u503c\u5c5e\u6027\u4e3a <code>null</code>, \u90a3\u4e48\u76f8\u5e94\u7684 JavaScript \u4ee3\u7406\u5c06\u4e3a <code>null</code>\u3002

src/main/webapp/Links/Links.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import hudson.Extension;
44
import jenkins.model.ModelObjectWithChildren;
55
import jenkins.model.ModelObjectWithContextMenu;
6-
import org.kohsuke.stapler.StaplerRequest;
7-
import org.kohsuke.stapler.StaplerResponse;
6+
import org.kohsuke.stapler.StaplerRequest2;
7+
import org.kohsuke.stapler.StaplerResponse2;
88

99
/**
1010
* @author Kohsuke Kawaguchi
@@ -19,7 +19,7 @@ public String getIconFileName() {
1919
/**
2020
* This method is called via AJAX to obtain the context menu for this model object.
2121
*/
22-
public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
22+
public ContextMenu doContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
2323
if (false) {
2424
/*
2525
this implementation is sufficient for most ModelObjects. It uses sidepanel.jelly to
@@ -41,7 +41,7 @@ public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse respons
4141
}
4242
}
4343

44-
public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
44+
public ContextMenu doChildrenContextMenu(StaplerRequest2 request, StaplerResponse2 response) throws Exception {
4545
/* You implement this method in much the same way you do doContextMenu */
4646
return new ContextMenu()
4747
.add("https://yahoo.com/","Yahoo")

0 commit comments

Comments
 (0)