aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--background_page.html74
-rw-r--r--vimiumFrontend.js22
2 files changed, 83 insertions, 13 deletions
diff --git a/background_page.html b/background_page.html
index 9b10172e..e98c7453 100644
--- a/background_page.html
+++ b/background_page.html
@@ -1,6 +1,10 @@
<html>
<head>
<script type="text/javascript" charset="utf-8">
+ // Currently we need to remember to change this each time we push. Chromium #15242 will enable us
+ // to retrieve this programmatically.
+ var currentVersion = "1.15";
+
var tabQueue = {}; // windowId -> Array
var keyQueue = ""; // Queue of keys typed
var validFirstKeys = {};
@@ -49,7 +53,8 @@
var sendRequestHandlers = {
getCompletionKeys: getCompletionKeys,
- getLinkHintCss: getLinkHintCss
+ getLinkHintCss: getLinkHintCss,
+ upgradeNotificationClosed: upgradeNotificationClosed
};
// Event handlers
@@ -62,11 +67,17 @@
// If this is a tab we've been waiting to open, execute any "tab loaded" handlers, e.g. to restore
// the tab's scroll position. Wait until domReady before doing this; otherwise operations like restoring
// the scroll position will not be possible.
- if (port.name == "domReady" && senderTabId && tabLoadedHandlers[senderTabId]) {
- var toCall = tabLoadedHandlers[senderTabId];
- // Delete first to be sure there's no circular events.
- delete tabLoadedHandlers[senderTabId];
- toCall.call();
+ if (port.name == "domReady" && senderTabId != null) {
+ if (tabLoadedHandlers[senderTabId]) {
+ var toCall = tabLoadedHandlers[senderTabId];
+ // Delete first to be sure there's no circular events.
+ delete tabLoadedHandlers[senderTabId];
+ toCall.call();
+ }
+
+ // domReady is the appropriate time to show the "vimium has been upgraded" message.
+ if (shouldShowUpgradeMessage())
+ chrome.tabs.sendRequest(senderTabId, { name: "showUpgradeNotification", version: currentVersion });
}
if (portHandlers[port.name])
@@ -76,7 +87,6 @@
chrome.extension.onRequest.addListener(function (request, sender, sendResponse) {
var senderTabId = sender.tab ? sender.tab.id : null;
-
if (sendRequestHandlers[request.handler])
sendResponse(sendRequestHandlers[request.handler](request));
});
@@ -143,6 +153,15 @@
}
/*
+ * Called when the user has clicked the close icon on the "Vimium has been updated" message.
+ * We should now dismiss that message in all tabs.
+ */
+ function upgradeNotificationClosed(request) {
+ localStorage.previousVersion = currentVersion;
+ sendRequestToAllTabs({ name: "hideUpgradeNotification" });
+ }
+
+ /*
* Used by the content scripts to get settings from the local storage.
*/
function getSetting(args, port) {
@@ -411,12 +430,51 @@
return newKeyQueue;
}
+ /*
+ * Message all tabs. Args should be the arguments hash used by the Chrome sendRequest API.
+ */
+ function sendRequestToAllTabs(args) {
+ chrome.windows.getAll({ populate: true }, function(windows) {
+ for (var i = 0; i < windows.length; i++)
+ for (var j = 0; j < windows[i].tabs.length; j++)
+ chrome.tabs.sendRequest(windows[i].tabs[j].id, args, null);
+ });
+ }
+
+ // Compares two version strings (e.g. "1.1" and "1.5") and returns
+ // -1 if versionA is < versionB, 0 if they're equal, and 1 if versionA is > versionB.
+ function compareVersions(versionA, versionB) {
+ versionA = versionA.split(".");
+ versionB = versionB.split(".");
+ for (var i = 0; i < Math.max(versionA.length, versionB.length); i++) {
+ var a = parseInt(versionA[i] || 0);
+ var b = parseInt(versionB[i] || 0);
+ if (a < b) return -1;
+ else if (a > b) return 1;
+ }
+ return 0;
+ }
+
+ /*
+ * Returns true if the current extension version is greater than the previously recorded version in
+ * localStorage, and false otherwise.
+ */
+ function shouldShowUpgradeMessage() {
+ // Avoid showing the upgrade notification when localStorage.previousVersion is undefined, which is the
+ // case for new installs.
+ if (!localStorage.previousVersion)
+ localStorage.previousVersion = currentVersion;
+ return compareVersions(currentVersion, localStorage.previousVersion) == 1;
+ }
+
function init() {
populateValidFirstKeys();
populateSingleKeyCommands();
+ if (shouldShowUpgradeMessage())
+ sendRequestToAllTabs({ name: "showUpgradeNotification", version: currentVersion });
}
init();
</script>
</head>
-</html>
+</html> \ No newline at end of file
diff --git a/vimiumFrontend.js b/vimiumFrontend.js
index 6a864cc4..4d380d2d 100644
--- a/vimiumFrontend.js
+++ b/vimiumFrontend.js
@@ -82,6 +82,14 @@ function initializePreDomReady() {
else
platform = "Windows";
+ chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
+ if (request.name == "hideUpgradeNotification")
+ HUD.hideUpgradeNotification();
+ else if (request.name == "showUpgradeNotification" && isEnabledForUrl)
+ HUD.showUpgradeNotification(request.version);
+ sendResponse({}); // Free up the resources used by this open connection.
+ });
+
chrome.extension.onConnect.addListener(function(port, name) {
if (port.name == "executePageCommand") {
port.onMessage.addListener(function(args) {
@@ -536,15 +544,19 @@ HUD = {
showUpgradeNotification: function(version) {
HUD.upgradeNotificationElement().innerHTML = "Vimium has been updated to " +
"<a href='https://chrome.google.com/extensions/detail/dbepggeogbaibhgnhhndojpepiihcmeb'>" +
- version + ".</a><a class='close-button' href='#'>x</a>";
- var closeLink = HUD.upgradeNotificationElement().getElementsByClassName("close-button")[0];
- closeLink.addEventListener("click", HUD.onCloseNotificationClick, false);
+ version + "</a>.<a class='close-button' href='#'>x</a>";
+ var links = HUD.upgradeNotificationElement().getElementsByTagName("a");
+ links[0].addEventListener("click", HUD.onUpdateLinkClicked, false);
+ links[1].addEventListener("click", function(event) {
+ event.preventDefault();
+ HUD.onUpdateLinkClicked();
+ });
Tween.fade(HUD.upgradeNotificationElement(), 1.0, 150);
},
- onCloseNotificationClick: function(event) {
- event.preventDefault();
+ onUpdateLinkClicked: function(event) {
HUD.hideUpgradeNotification();
+ chrome.extension.sendRequest({ handler: "upgradeNotificationClosed" });
},
hideUpgradeNotification: function(clickEvent) {