Update the Sign In anchor with current URL

Always update the href of the Sign In anchor in the menu bar with
the current page URL after /login/, making the redirect process
bring users back to the current view after sign in.

Change-Id: Id97566975a2193be0e43552d25b0d75f56c9eceb
This commit is contained in:
Shawn O. Pearce
2012-01-19 16:42:46 -08:00
parent 2b3cd55297
commit 31d7c88643

View File

@@ -20,7 +20,6 @@ import com.google.gerrit.client.changes.ChangeConstants;
import com.google.gerrit.client.changes.ChangeListScreen; import com.google.gerrit.client.changes.ChangeListScreen;
import com.google.gerrit.client.patches.PatchScreen; import com.google.gerrit.client.patches.PatchScreen;
import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.ui.CommandMenuItem;
import com.google.gerrit.client.ui.LinkMenuBar; import com.google.gerrit.client.ui.LinkMenuBar;
import com.google.gerrit.client.ui.LinkMenuItem; import com.google.gerrit.client.ui.LinkMenuItem;
import com.google.gerrit.client.ui.MorphingTabPanel; import com.google.gerrit.client.ui.MorphingTabPanel;
@@ -190,13 +189,7 @@ public class Gerrit implements EntryPoint {
*/ */
public static void updateImpl(final String token) { public static void updateImpl(final String token) {
History.newItem(token, false); History.newItem(token, false);
dispatchHistoryHooks(token);
if (historyHooks != null) {
// Because we blocked firing the event our history hooks won't be
// informed of the current token. Manually fire the event to them.
//
dispatchHistoryHooks(token);
}
} }
public static void setQueryString(String query) { public static void setQueryString(String query) {
@@ -249,10 +242,7 @@ public class Gerrit implements EntryPoint {
case HTTP_LDAP: case HTTP_LDAP:
case CLIENT_SSL_CERT_LDAP: case CLIENT_SSL_CERT_LDAP:
case CUSTOM_EXTENSION: case CUSTOM_EXTENSION:
if (token.startsWith("/")) { Location.assign(loginRedirect(token));
token = token.substring(1);
}
Location.assign(selfRedirect("/login/" + token));
break; break;
case DEVELOPMENT_BECOME_ANY_ACCOUNT: case DEVELOPMENT_BECOME_ANY_ACCOUNT:
@@ -270,6 +260,15 @@ public class Gerrit implements EntryPoint {
} }
} }
private static String loginRedirect(String token) {
if (token == null) {
token = "";
} else if (token.startsWith("/")) {
token = token.substring(1);
}
return selfRedirect("/login/" + token);
}
private static String selfRedirect(String suffix) { private static String selfRedirect(String suffix) {
// Clean up the path. Users seem to like putting extra slashes into the URL // Clean up the path. Users seem to like putting extra slashes into the URL
// which can break redirections by misinterpreting at either client or server. // which can break redirections by misinterpreting at either client or server.
@@ -376,6 +375,7 @@ public class Gerrit implements EntryPoint {
} }
private static ArrayList<JavaScriptObject> historyHooks; private static ArrayList<JavaScriptObject> historyHooks;
private static Anchor signInAnchor;
private static native void initHistoryHooks() private static native void initHistoryHooks()
/*-{ $wnd['gerrit_addHistoryHook'] = function(h) { @com.google.gerrit.client.Gerrit::addHistoryHook(Lcom/google/gwt/core/client/JavaScriptObject;)(h); }; }-*/; /*-{ $wnd['gerrit_addHistoryHook'] = function(h) { @com.google.gerrit.client.Gerrit::addHistoryHook(Lcom/google/gwt/core/client/JavaScriptObject;)(h); }; }-*/;
@@ -397,9 +397,14 @@ public class Gerrit implements EntryPoint {
/*-{ hook(url); }-*/; /*-{ hook(url); }-*/;
private static void dispatchHistoryHooks(final String historyToken) { private static void dispatchHistoryHooks(final String historyToken) {
final String url = Location.getPath() + "#" + historyToken; if (signInAnchor != null) {
for (final JavaScriptObject hook : historyHooks) { signInAnchor.setHref(loginRedirect(historyToken));
callHistoryHook(hook, url); }
if (historyHooks != null) {
final String url = Location.getPath() + "#" + historyToken;
for (final JavaScriptObject hook : historyHooks) {
callHistoryHook(hook, url);
}
} }
} }
@@ -464,9 +469,7 @@ public class Gerrit implements EntryPoint {
final String token = view.getToken(); final String token = view.getToken();
if (!token.equals(History.getToken())) { if (!token.equals(History.getToken())) {
History.newItem(token, false); History.newItem(token, false);
if (historyHooks != null) { dispatchHistoryHooks(token);
dispatchHistoryHooks(token);
}
} }
if (view instanceof ChangeListScreen) { if (view instanceof ChangeListScreen) {
@@ -606,14 +609,8 @@ public class Gerrit implements EntryPoint {
if (cfg.getRegisterUrl() != null) { if (cfg.getRegisterUrl() != null) {
menuRight.add(anchor(C.menuRegister(), cfg.getRegisterUrl())); menuRight.add(anchor(C.menuRegister(), cfg.getRegisterUrl()));
} }
CommandMenuItem signIn = new CommandMenuItem(C.menuSignIn(), signInAnchor = anchor(C.menuSignIn(), loginRedirect(""));
new Command() { menuRight.add(signInAnchor);
public void execute() {
doSignIn(History.getToken());
}
});
signIn.setHref(selfRedirect("/login/"));
menuRight.addItem(signIn);
break; break;
case DEVELOPMENT_BECOME_ANY_ACCOUNT: case DEVELOPMENT_BECOME_ANY_ACCOUNT: