From 002c9cb5b2f5dd23463bed5d1e5662ab6d40f412 Mon Sep 17 00:00:00 2001 From: Edwin Kempin Date: Wed, 6 Nov 2013 09:10:47 +0100 Subject: [PATCH 1/2] Support 'id' attribute for menu items contributed by plugins For menu items in the top menu that are contributed by plugins it is now optionally possible to specify the 'id' attribute. Having the 'id' attribute allows GWT UI plugins to manipulate the menu item. E.g. a GWT plugin could open a dialog box when the user clicks on the menu item: RootPanel rootPanel = RootPanel.get(MENU_ID); rootPanel.getElement().removeAttribute("href"); rootPanel.addDomHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { dialogBox.center(); dialogBox.show(); } }, ClickEvent.getType()); Change-Id: Icbe2a5c5af9c126a6dd2373b768cae651e482200 --- Documentation/rest-api-config.txt | 19 ++++++++++--------- .../gerrit/extensions/webui/TopMenu.java | 6 ++++++ .../java/com/google/gerrit/client/Gerrit.java | 3 +++ .../gerrit/client/extensions/TopMenuItem.java | 1 + 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Documentation/rest-api-config.txt b/Documentation/rest-api-config.txt index 4f25aa85a1..5bd5e0c0f8 100644 --- a/Documentation/rest-api-config.txt +++ b/Documentation/rest-api-config.txt @@ -181,7 +181,7 @@ CapabilityInfo ~~~~~~~~~~~~~~ The `CapabilityInfo` entity contains information about a capability. -[options="header",width="50%",cols="1,5"] +[options="header",width="50%",cols="1,6"] |================================= |Field Name |Description |`kind` |`gerritcodereview#capability` @@ -195,7 +195,7 @@ TopMenuEntryInfo The `TopMenuEntryInfo` entity contains information about a top menu entry. -[options="header",width="50%",cols="1,5"] +[options="header",width="50%",cols="1,6"] |================================= |Field Name |Description |`name` |Name of the top menu entry. @@ -208,13 +208,14 @@ TopMenuItemInfo The `TopMenuItemInfo` entity contains information about a menu item in a top menu entry. -[options="header",width="50%",cols="1,5"] -|================================= -|Field Name |Description -|`url` |The URL of the menu item link. -|`name` |The name of the menu item. -|`target` |Target attribute of the menu item link. -|================================= +[options="header",width="50%",cols="1,^1,5"] +|======================== +|Field Name ||Description +|`url` ||The URL of the menu item link. +|`name` ||The name of the menu item. +|`target` ||Target attribute of the menu item link. +|`id` |optional|The `id` attribute of the menu item link. +|======================== GERRIT ------ diff --git a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java index 7389519fc1..e5a1f7e28d 100644 --- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java +++ b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/webui/TopMenu.java @@ -38,15 +38,21 @@ public interface TopMenu { public final String url; public final String name; public final String target; + public final String id; public MenuItem(String name, String url) { this(name, url, "_blank"); } public MenuItem(String name, String url, String target) { + this(name, url, target, null); + } + + public MenuItem(String name, String url, String target, String id) { this.url = url; this.name = name; this.target = target; + this.id = id; } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java index e73670f18d..568a15c26f 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java @@ -978,6 +978,9 @@ public class Gerrit implements EntryPoint { private static void addExtensionLink(final LinkMenuBar m, final TopMenuItem item) { final Anchor atag = anchor(item.getName(), item.getUrl()); atag.setTarget(item.getTarget()); + if (item.getId() != null) { + atag.getElement().setAttribute("id", item.getId()); + } m.add(atag); } } diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java index 7906fd0511..22bb981095 100644 --- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/extensions/TopMenuItem.java @@ -20,6 +20,7 @@ public class TopMenuItem extends JavaScriptObject { public final native String getName() /*-{ return this.name; }-*/; public final native String getUrl() /*-{ return this.url; }-*/; public final native String getTarget() /*-{ return this.target; }-*/; + public final native String getId() /*-{ return this.id; }-*/; protected TopMenuItem() { } From a716d228d4a25e3952663a9dcc4bb2c2851f6cb4 Mon Sep 17 00:00:00 2001 From: Jacek Centkowski Date: Thu, 24 Oct 2013 03:22:41 -0700 Subject: [PATCH 2/2] Make plugin servlet's context path authorization aware When authorized call is performed to plugin servlet its context contains authorization prefix. Therefore request URI can be matched with servlet's path and as a result properly handled. Change-Id: I6b5efc8dfdd3dda85ba8cf1a86a127b19ab9ea6d Signed-off-by: Jacek Centkowski --- .../gerrit/httpd/plugins/HttpPluginServlet.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java index 549c2398a4..d3693a5a98 100644 --- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java +++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/plugins/HttpPluginServlet.java @@ -78,6 +78,8 @@ class HttpPluginServlet extends HttpServlet private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(HttpPluginServlet.class); + private static final String PLUGINS_PREFIX = "/plugins/"; + private static final String AUTHORIZED_PREFIX = "/a" + PLUGINS_PREFIX; private final MimeUtilFileTypeRegistry mimeUtil; private final Provider webUrl; @@ -88,6 +90,7 @@ class HttpPluginServlet extends HttpServlet private List pending = Lists.newArrayList(); private String base; + private String authorizedBase; private final ConcurrentMap plugins = Maps.newConcurrentMap(); @@ -126,7 +129,8 @@ class HttpPluginServlet extends HttpServlet super.init(config); String path = config.getServletContext().getContextPath(); - base = Strings.nullToEmpty(path) + "/plugins/"; + base = Strings.nullToEmpty(path) + PLUGINS_PREFIX; + authorizedBase = Strings.nullToEmpty(path) + AUTHORIZED_PREFIX; for (Plugin plugin : pending) { install(plugin); } @@ -210,7 +214,8 @@ class HttpPluginServlet extends HttpServlet return; } - WrappedRequest wr = new WrappedRequest(req, base + name); + WrappedRequest wr = new WrappedRequest(req, + (isAuthorizedCall(req) ? authorizedBase : base) + name); FilterChain chain = new FilterChain() { @Override public void doFilter(ServletRequest req, ServletResponse res) @@ -225,6 +230,11 @@ class HttpPluginServlet extends HttpServlet } } + private boolean isAuthorizedCall(HttpServletRequest req) { + return !Strings.isNullOrEmpty(req.getServletPath()) + && req.getServletPath().startsWith(AUTHORIZED_PREFIX); + } + private static boolean isApiCall(HttpServletRequest req, List parts) { String method = req.getMethod(); int cnt = parts.size();