Store imagare user preferences in a browser cookie This avoids making a call to the server to fetch the preferences everytime a change or diff screen is viewed. The cookie expires once a day so that new defaults will be picked up. Change-Id: I73871efa32f3c8b6b7b84aa6b41864c766eb537c Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareConfigScreen.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareConfigScreen.java index 0a4f83d..f0a2faf 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareConfigScreen.java +++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagareConfigScreen.java
@@ -136,6 +136,7 @@ @Override public void onSuccess(JavaScriptObject result) { saveButton.setEnabled(false); + onSave(); } @Override @@ -144,4 +145,7 @@ } }); } + + protected void onSave() { + } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePreferenceScreen.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePreferenceScreen.java index bae87be..5922452 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePreferenceScreen.java +++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/client/ImagarePreferenceScreen.java
@@ -17,6 +17,7 @@ import com.google.gerrit.plugin.client.Plugin; import com.google.gerrit.plugin.client.rpc.RestApi; import com.google.gerrit.plugin.client.screen.Screen; +import com.google.gwt.user.client.Cookies; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.ImageResourceRenderer; @@ -58,4 +59,10 @@ super.display(info); } + + @Override + protected void onSave() { + super.onSave(); + Cookies.removeCookie(Plugin.get().getPluginName() + "~prefs"); + } }
diff --git a/src/main/resources/static/imagare.js b/src/main/resources/static/imagare.js index f55087e..acf14cf 100644 --- a/src/main/resources/static/imagare.js +++ b/src/main/resources/static/imagare.js
@@ -18,23 +18,64 @@ return; } - Gerrit.get('/accounts/self/preference', function(r) { - if (!r.pattern) { - return; - } - - if ('TOOLTIP' === r.link_decoration) { - addTooltips(r.pattern); - } else if ('INLINE' === r.link_decoration) { - inlineImages(r.pattern); - } - }); + var prefs = getPrefsFromCookie(); + if (prefs !== null) { + convertImageLinks(prefs); + } else { + Gerrit.get('/accounts/self/preference', function(prefs) { + storePrefsInCookie(prefs); + convertImageLinks(prefs); + }); + } } function startsWith(s, p) { return s.slice(0, p.length) == p; } + function storePrefsInCookie(prefs) { + var date = new Date(); + date.setTime(date.getTime() + (1 * 24 * 60 * 60 * 1000)); // 1 day + document.cookie = getCookieName() + + "=" + + JSON.stringify(prefs) + + "; expires=" + date.toGMTString() + + "; path=/"; + } + + function getPrefsFromCookie() { + var cookie = document.cookie; + if (cookie.length > 0) { + var cookieName = getCookieName(); + var start = cookie.indexOf(cookieName + "="); + if (start != -1) { + start = start + cookieName.length + 1; + var end = document.cookie.indexOf(";", start); + if (end == -1) { + end = document.cookie.length; + } + return JSON.parse(unescape(document.cookie.substring(start, end))); + } + } + return null; + } + + function getCookieName() { + return self.getPluginName() + "~prefs"; + } + + function convertImageLinks(prefs) { + if (!prefs.pattern) { + return; + } + + if ('TOOLTIP' === prefs.link_decoration) { + addTooltips(prefs.pattern); + } else if ('INLINE' === prefs.link_decoration) { + inlineImages(prefs.pattern); + } + } + function inlineImages(pattern) { var l = document.links; for(var i = 0; i < l.length; i++) {