Bug 307358 - Missing notification after auto-check finds updates to Extensions. patch=michael.wu, r=rob_strong

This commit is contained in:
rob_strong%exchangecode.com 2006-06-20 02:58:31 +00:00
Родитель cd6e396b42
Коммит f95efb0b36
9 изменённых файлов: 156 добавлений и 37 удалений

Просмотреть файл

@ -146,7 +146,7 @@ pref("app.update.incompatible.mode", 0);
pref("extensions.update.enabled", true);
pref("extensions.update.url", "chrome://mozapps/locale/extensions/extensions.properties");
pref("extensions.update.interval", 86400); // Check for updates to Extensions and
// Themes every week
// Themes every day
// Non-symmetric (not shared by extensions) extension-specific [update] preferences
pref("extensions.getMoreExtensionsURL", "chrome://mozapps/locale/extensions/extensions.properties");
pref("extensions.getMoreThemesURL", "chrome://mozapps/locale/extensions/extensions.properties");

Просмотреть файл

@ -31,6 +31,12 @@
<!ENTITY cmd.restartApp.label "Restart &brandShortName;">
<!ENTITY cmd.restartApp.accesskey "R">
<!ENTITY cmd.restartApp.tooltip "Restarts &brandShortName; to finish the installation">
<!ENTITY cmd.skip.label "Skip">
<!ENTITY cmd.skip.accesskey "S">
<!ENTITY cmd.skip.tooltip "Skip these updates">
<!ENTITY cmd.continue.label "Continue">
<!ENTITY cmd.continue.accesskey "C">
<!ENTITY cmd.continue.tooltip "Continue loading &brandShortName;">
<!ENTITY cmd.enableAll.label "Enable All">
<!ENTITY cmd.enableAll.accesskey "a">
@ -100,6 +106,7 @@
<!ENTITY moreInfo.label "More Information">
<!ENTITY closeMessage.tooltip "Close this message">
<!ENTITY updateSuccess.label "Update completed successfully.">
<!ENTITY installSuccess.label "Install completed successfully.">
<!ENTITY installSuccessRestart.label "Restart to complete the installation.">
<!ENTITY installWaiting.label "Waiting...">

Просмотреть файл

@ -32,7 +32,7 @@ disableTitle=Disable %S
disableWarningDependMessage=If you disable %S, the following items that require this extension will also be disabled:
disableQueryMessage=Do you want to disable %S?
extensions.update.url=https://addons.mozilla.org/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&status=%ITEM_STATUS%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=%APP_OS%&appABI=%APP_ABI%
extensions.update.url=https://addons.mozilla.org/update/VersionCheck.php?reqVersion=%REQ_VERSION%&id=%ITEM_ID%&version=%ITEM_VERSION%&maxAppVersion=%ITEM_MAXAPPVERSION%&appID=%APP_ID%&appVersion=%APP_VERSION%&appOS=%APP_OS%&appABI=%APP_ABI%
extensions.getMoreExtensionsURL=https://addons.mozilla.org/extensions/?application=%APPID%
extensions.getMoreThemesURL=https://addons.mozilla.org/themes/?application=%APPID%
@ -129,3 +129,6 @@ enableButtonLabel=Enable
enableButtonAccesskey=n
goOnlineButtonLabel=Go Online
goOnlineButtonAccesskey=G
newUpdateWindowTitle=%S Add-on Updates
newUpdatesAvailableMsg=There are new updates available for your add-ons.

Просмотреть файл

@ -46,6 +46,10 @@ richlistitem[state="success"][opType="none"] hbox.addon-install-status {
-moz-binding: url("chrome://mozapps/content/extensions/extensions.xml#addon-install-success");
}
richlistbox[norestart] richlistitem[state="success"] hbox.addon-install-status {
-moz-binding: url("chrome://mozapps/content/extensions/extensions.xml#addon-install-updated");
}
richlistitem[state="failure"] hbox.addon-install-status {
-moz-binding: url("chrome://mozapps/content/extensions/extensions.xml#addon-install-fail");
}

Просмотреть файл

@ -54,6 +54,7 @@ var gDownloadManager = null;
var gObserverIndex = -1;
var gInSafeMode = false;
var gCheckCompat = true;
var gUpdatesOnly = false;
var gAppID = "";
var gPref = null;
@ -64,6 +65,7 @@ const PREF_EXTENSIONS_DSS_ENABLED = "extensions.dss.enabled";
const PREF_EXTENSIONS_DSS_SWITCHPENDING = "extensions.dss.switchPending";
const PREF_EM_LAST_SELECTED_SKIN = "extensions.lastSelectedSkin";
const PREF_GENERAL_SKINS_SELECTEDSKIN = "general.skins.selectedSkin";
const PREF_UPDATE_NOTIFYUSER = "extensions.update.notifyUser";
const RDFURI_ITEM_ROOT = "urn:mozilla:item:root";
const PREFIX_ITEM_URI = "urn:mozilla:item:";
@ -229,6 +231,8 @@ function showView(aView) {
var showCheckUpdatesAll = true;
var showInstallUpdatesAll = false;
var showRestartApp = false;
var showSkip = false;
var showContinue = false;
switch (aView) {
case "extensions":
var types = [ [ ["type", nsIUpdateItem.TYPE_EXTENSION, "Integer" ] ] ];
@ -247,6 +251,8 @@ function showView(aView) {
showInstallFile = false;
showCheckUpdatesAll = false;
showInstallUpdatesAll = true;
if (gUpdatesOnly)
showSkip = true;
bindingList = [ ["aboutURL", "?aboutURL"],
["availableUpdateURL", "?availableUpdateURL"],
["availableUpdateVersion", "?availableUpdateVersion"],
@ -270,7 +276,10 @@ function showView(aView) {
showInstallFile = false;
showCheckUpdatesAll = false;
showInstallUpdatesAll = false;
showRestartApp = true;
if (gUpdatesOnly)
showContinue = true;
else
showRestartApp = true;
bindingList = [ ["aboutURL", "?aboutURL"],
["addonID", "?addonID"],
["availableUpdateURL", "?availableUpdateURL"],
@ -342,8 +351,23 @@ function showView(aView) {
document.getElementById("checkUpdatesAllButton").hidden = !showCheckUpdatesAll;
document.getElementById("installUpdatesAllButton").hidden = !showInstallUpdatesAll;
document.getElementById("restartAppButton").hidden = !showRestartApp;
document.getElementById("skipDialogButton").hidden = !showSkip;
document.getElementById("continueDialogButton").hidden = !showContinue;
document.getElementById("themePreviewArea").hidden = !isThemes;
document.getElementById("themeSplitter").hidden = !isThemes;
if (showSkip) {
var button = document.getElementById("installUpdatesAllButton");
button.setAttribute("default", "true");
window.setTimeout(function () { button.focus(); }, 0);
} else
document.getElementById("installUpdatesAllButton").removeAttribute("default");
if (showContinue)
document.getElementById("continueDialogButton").setAttribute("default", "true");
else
document.getElementById("continueDialogButton").removeAttribute("default");
if (isThemes)
onAddonSelect();
updateGlobalCommands();
@ -502,20 +526,6 @@ function Startup()
gObserverIndex = gExtensionManager.addUpdateListener(gDownloadManager);
if ("arguments" in window) {
try {
var params = window.arguments[0].QueryInterface(Components.interfaces.nsIDialogParamBlock);
gDownloadManager.addDownloads(params);
}
catch (e) {
if (window.arguments[0] == "updatecheck")
checkUpdatesAll();
}
}
if (gExtensionsView.selectedItem)
gExtensionsView.scrollBoxObject.scrollToElement(gExtensionsView.selectedItem);
if (!gCheckCompat) {
var msgText = getExtensionString("disabledCompatMsg");
var buttonLabel = getExtensionString("enableButtonLabel");
@ -532,6 +542,33 @@ function Startup()
getExtensionString("safeModeMsg"),
null, null, true, null);
}
if ("arguments" in window) {
try {
var params = window.arguments[0].QueryInterface(Components.interfaces.nsIDialogParamBlock);
gDownloadManager.addDownloads(params);
}
catch (e) {
if (window.arguments[0] == "updatecheck")
checkUpdatesAll();
else if (window.arguments[0] == "updates-only") {
gUpdatesOnly = true;
document.getElementById("viewGroup").hidden = true;
document.getElementById("extensionsView").setAttribute("norestart", "");
showView('updates');
var addonsMsg = document.getElementById("addonsMsg");
addonsMsg.showMessage("chrome://mozapps/skin/extensions/question.png",
getExtensionString("newUpdatesAvailableMsg"),
null, null, true, null);
document.title = getExtensionString("newUpdateWindowTitle", [getBrandShortName()]);
}
}
}
if (gExtensionsView.selectedItem)
gExtensionsView.scrollBoxObject.scrollToElement(gExtensionsView.selectedItem);
gPref.setBoolPref(PREF_UPDATE_NOTIFYUSER, false);
}
function Shutdown()
@ -1298,6 +1335,10 @@ function updateGlobalCommands() {
setElementDisabledByID("cmd_installUpdatesAll", disableInstallUpdate);
setElementDisabledByID("cmd_restartApp", disableAppRestart);
setElementDisabledByID("cmd_installFile", disableInstallFile);
var button = document.getElementById("continueDialogButton");
if (!button.hidden && !disableAppRestart)
button.focus();
}
function checkUpdatesAll() {
@ -1320,6 +1361,8 @@ function checkUpdatesAll() {
}
if (gExtensionsView.selectedItem)
gExtensionsView.selectedItem.focus();
gPref.setBoolPref(PREF_UPDATE_NOTIFYUSER, false);
}
function installUpdatesAll() {
@ -1329,6 +1372,11 @@ function installUpdatesAll() {
if (!isXPInstallEnabled())
return;
if (gUpdatesOnly) {
var addonsMsg = document.getElementById("addonsMsg");
addonsMsg.hideMessage();
}
var items = [];
var children = gExtensionsView.children;
for (var i = 0; i < children.length; ++i) {

Просмотреть файл

@ -464,6 +464,12 @@
</content>
</binding>
<binding id="addon-install-updated">
<content>
<xul:label value="&updateSuccess.label;" flex="1" crop="end"/>
</content>
</binding>
<binding id="install-downloading" extends="chrome://mozapps/content/extensions/extensions.xml#addon-base">
<content>
<xul:hbox flex="1">

Просмотреть файл

@ -210,6 +210,14 @@
accesskey="&cmd.restartApp.accesskey;"
tooltiptext="&cmd.restartApp.tooltip;"
command="cmd_restartApp"/>
<button id="skipDialogButton" label="&cmd.skip.label;"
accesskey="&cmd.skip.accesskey;"
tooltiptext="&cmd.skip.tooltip;"
command="cmd_close"/>
<button id="continueDialogButton" label="&cmd.continue.label;"
accesskey="&cmd.continue.accesskey;"
tooltiptext="&cmd.continue.tooltip;"
command="cmd_restartApp"/>
<label id="getMore" class="text-link"
valuethemes="&getMoreThemes.label;"
valueextensions="&getMoreExtensions.label;"

Просмотреть файл

@ -77,6 +77,7 @@ const PREF_BLOCKLIST_URL = "extensions.blocklist.url";
const PREF_BLOCKLIST_DETAILS_URL = "extensions.blocklist.detailsURL";
const PREF_BLOCKLIST_ENABLED = "extensions.blocklist.enabled";
const PREF_BLOCKLIST_INTERVAL = "extensions.blocklist.interval";
const PREF_UPDATE_NOTIFYUSER = "extensions.update.notifyUser";
const DIR_EXTENSIONS = "extensions";
const DIR_CHROME = "chrome";
@ -2709,6 +2710,7 @@ ExtensionManager.prototype = {
break;
case "profile-after-change":
this._profileSelected();
this._showUpdatesWindow();
break;
case "quit-application-requested":
this._confirmCancelDownloadsOnQuit(subject);
@ -2777,12 +2779,33 @@ ExtensionManager.prototype = {
catch (e) {
}
},
/**
* Notify user that there are new addons updates
*/
_showUpdatesWindow: function() {
if (!getPref("getBoolPref", PREF_UPDATE_NOTIFYUSER, false))
return;
const EMURL = "chrome://mozapps/content/extensions/extensions.xul";
const EMFEATURES = "chrome,centerscreen,extra-chrome,dialog,resizable,modal";
var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Components.interfaces.nsIWindowWatcher);
var param = Components.classes["@mozilla.org/supports-array;1"]
.createInstance(Components.interfaces.nsISupportsArray);
var arg = Components.classes["@mozilla.org/supports-string;1"]
.createInstance(Components.interfaces.nsISupportsString);
arg.data = "updates-only";
param.AppendElement(arg);
ww.openWindow(null, EMURL, null, EMFEATURES, param);
},
/**
* Clean up on application shutdown to avoid leaks.
*/
_shutdown: function() {
gOS.removeObserver(this, "xpcom-shutdown");
gOS.removeObserver(this, "xpcom-shutdown");
// Release strongly held services.
gOS = null;
@ -2896,8 +2919,14 @@ ExtensionManager.prototype = {
* The timer that fired
*/
notify: function(timer) {
if (getPref("getBoolPref", PREF_EM_UPDATE_ENABLED, true))
this.update([], 0, false, null);
if (!getPref("getBoolPref", PREF_EM_UPDATE_ENABLED, true))
return;
var items = this.getItemList(nsIUpdateItem.TYPE_ADDON, { });
var updater = new ExtensionItemUpdater(gApp.ID, gApp.version, this);
updater._background = true;
updater.checkForUpdates(items, items.length, false, null);
},
/**
@ -3619,7 +3648,7 @@ ExtensionManager.prototype = {
var cr = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
.getService(Components.interfaces.nsIChromeRegistry);
cr.checkForNewChrome();
}
}
// If no additional restart is required, it implies that there are
// no new components that need registering so we can inform the app
@ -3703,6 +3732,9 @@ ExtensionManager.prototype = {
}
else if (!ds.getItemProperty(id, "appDisabled"))
ds.setItemProperty(id, EM_R("appDisabled"), EM_L("true"));
ds.setItemProperty(id, EM_R("availableUpdateURL"), null);
ds.setItemProperty(id, EM_R("availableUpdateVersion"), null);
}
// Update the manifests to reflect the items that were disabled / enabled.
this._updateManifests(true);
@ -3720,6 +3752,8 @@ ExtensionManager.prototype = {
// Update the last app version so we don't do this again with this version.
gPref.setCharPref(PREF_EM_LAST_APP_VERSION, currAppVersion);
// Prevent extension update dialog from showing
gPref.setBoolPref(PREF_UPDATE_NOTIFYUSER, false);
return true;
},
@ -5893,6 +5927,7 @@ ExtensionItemUpdater.prototype = {
_versionUpdateOnly : 0,
_items : [],
_listener : null,
_background : false,
/////////////////////////////////////////////////////////////////////////////
// ExtensionItemUpdater
@ -6000,6 +6035,12 @@ ExtensionItemUpdater.prototype = {
},
checkForDone: function(item, status) {
if (this._background &&
status == nsIAddonUpdateCheckListener.STATUS_UPDATE) {
var lastupdate = this._emDS.getItemProperty(item.id, "availableUpdateVersion");
if (lastupdate != item.version)
gPref.setBoolPref(PREF_UPDATE_NOTIFYUSER, true);
}
if (this._listener) {
try {
this._listener.onAddonUpdateEnded(item, status);
@ -6078,20 +6119,6 @@ RDFItemUpdater.prototype = {
this._versionUpdateOnly = aVersionUpdateOnly;
this._item = aItem;
var itemStatus;
if (emDS.getItemProperty(aItem.id, "userDisabled") == "true" ||
emDS.getItemProperty(aItem.id, "userDisabled") == OP_NEEDS_ENABLE)
itemStatus = "userDisabled";
else
itemStatus = "userEnabled";
if (emDS.getItemProperty(aItem.id, "compatible") == "false")
itemStatus += ",incompatible";
if (emDS.getItemProperty(aItem.id, "blocklisted") == "true")
itemStatus += ",blocklisted";
if (emDS.getItemProperty(aItem.id, "satisfiesDependencies") == "false")
itemStatus += ",needsDependencies";
// Look for a custom update URI: 1) supplied by a pref, 2) supplied by the
// install manifest, 3) the default configuration
try {
@ -6108,7 +6135,6 @@ RDFItemUpdater.prototype = {
dsURI = dsURI.replace(/%ITEM_ID%/g, aItem.id);
dsURI = dsURI.replace(/%ITEM_VERSION%/g, aItem.version);
dsURI = dsURI.replace(/%ITEM_MAXAPPVERSION%/g, aItem.maxAppVersion);
dsURI = dsURI.replace(/%ITEM_STATUS%/g, itemStatus);
dsURI = dsURI.replace(/%APP_ID%/g, this._updater._appID);
dsURI = dsURI.replace(/%APP_VERSION%/g, this._updater._appVersion);
dsURI = dsURI.replace(/%REQ_VERSION%/g, 1);

Просмотреть файл

@ -63,6 +63,23 @@ margin-top: -12px;
-moz-image-region: rect(21px, 42px, 42px, 21px);
}
/* these skip/continue icons don't make sense. it's just a placeholder. */
#skipDialogButton {
-moz-image-region: rect(0px, 42px, 21px, 21px);
}
#skipDialogButton[disabled="true"] {
-moz-image-region: rect(21px, 42px, 42px, 21px);
}
#continueDialogButton {
-moz-image-region: rect(0px, 42px, 21px, 21px);
}
#continueDialogButton[disabled="true"] {
-moz-image-region: rect(21px, 42px, 42px, 21px);
}
/* List Items */
richlistitem {
padding-top: 6px;