зеркало из https://github.com/mozilla/gecko-dev.git
Bug 307358 - Missing notification after auto-check finds updates to Extensions. patch=michael.wu, r=rob_strong
This commit is contained in:
Родитель
cd6e396b42
Коммит
f95efb0b36
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче