More on 170006 - mismatch checking, create extensions dir in profile if it does not exist, etc...

This commit is contained in:
ben%bengoodger.com 2004-04-23 10:16:20 +00:00
Родитель 0c5fe2e9d5
Коммит c8c7ae8b5d
11 изменённых файлов: 263 добавлений и 129 удалений

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

@ -169,6 +169,6 @@ function checkForUpdates()
// XXXben - check for "all types" and the app itself here. // XXXben - check for "all types" and the app itself here.
var em = Components.classes["@mozilla.org/extension-manager;1"] var em = Components.classes["@mozilla.org/extension-manager;1"]
.getService(Components.interfaces.nsIExtensionManager); .getService(Components.interfaces.nsIExtensionManager);
em.update([], 0, true); em.update([], 0, Components.interfaces.nsIExtensionManager.UPDATE_TYPE_USERINVOKED);
} }

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

@ -2,6 +2,7 @@
// Globals // Globals
const kObserverServiceProgID = "@mozilla.org/observer-service;1"; const kObserverServiceProgID = "@mozilla.org/observer-service;1";
const nsIExtensionItem = Components.interfaces.nsIExtensionItem;
var gExtensionManager = null; var gExtensionManager = null;
var gDownloadListener = null; var gDownloadListener = null;
@ -364,45 +365,13 @@ var gExtensionsViewController = {
}, },
cmd_update: function () cmd_update: function ()
{ {
var items = this._getItemList(null); var id = stripPrefix(gExtensionsView.selected.id);
gExtensionManager.update(items, item.length, var items = gExtensionManager.getItemList(id, nsIExtensionItem.TYPE_EXTENSION, { });
gExtensionManager.update(items, items.length,
Components.interfaces.nsIExtensionManager.UPDATE_TYPE_USERINVOKED); Components.interfaces.nsIExtensionManager.UPDATE_TYPE_USERINVOKED);
}, },
_getItemList: function (aItemID)
{
var items = [];
if (aItemID) {
var item = Components.classes["@mozilla.org/extensions/item;1"]
.createInstance(Components.interfaces.nsIExtensionItem);
item.init(aItemID, this.getExtensionProperty(aItemID, "version"),
this.getExtensionProperty(aItemID, "name"),
-1, "", "",
Components.interfaces.nsIExtensionItem.TYPE_EXTENSION); // XXXben
items.push(item);
}
else {
var ctr = Components.classes["@mozilla.org/rdf/container;1"]
.createInstance(Components.interfaces.nsIRDFContainer);
ctr.Init(this, this._rdf.GetResource("urn:mozilla:extension:root"));
var elements = ctr.GetElements();
while (elements.hasMoreElements()) {
var e = elements.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
var id = this._stripPrefix(e.Value);
var item = Components.classes["@mozilla.org/extensions/item;1"]
.createInstance(Components.interfaces.nsIExtensionItem);
item.init(id, this.getExtensionProperty(id, "version"),
this.getExtensionProperty(id, "name"),
-1, "", "",
Components.interfaces.nsIExtensionItem.TYPE_EXTENSION); // XXXben
items.push(item);
}
}
return items;
},
cmd_uninstall: function () cmd_uninstall: function ()
{ {
// Confirm the uninstall // Confirm the uninstall

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

@ -85,6 +85,11 @@ interface nsIExtensionManager : nsISupports
in unsigned long aItemCount, in unsigned long aItemCount,
in unsigned short aUpdateType); in unsigned short aUpdateType);
void getItemList(in string aItemID,
in unsigned short aType,
out unsigned long aItemCount,
[retval, array, size_is(aItemCount)] out nsIExtensionItem aItems);
readonly attribute nsIRDFDataSource datasource; readonly attribute nsIRDFDataSource datasource;
}; };
@ -92,5 +97,7 @@ interface nsIExtensionManager : nsISupports
interface nsIExtensionItemUpdater : nsISupports interface nsIExtensionItemUpdater : nsISupports
{ {
void checkForUpdates(); void checkForUpdates();
readonly attribute unsigned short updateType;
}; };

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

@ -254,7 +254,7 @@ nsExtensionManager.prototype = {
var appID = pref.getCharPref(PREF_EM_APP_ID); var appID = pref.getCharPref(PREF_EM_APP_ID);
var appVersion = pref.getCharPref(PREF_EM_APP_VERSION); var appVersion = pref.getCharPref(PREF_EM_APP_VERSION);
var updater = new nsExtensionItemUpdater(aItems, appID, appVersion); var updater = new nsExtensionItemUpdater(aUpdateType, aItems, appID, appVersion);
switch (aUpdateType) { switch (aUpdateType) {
case Components.interfaces.nsIExtensionManager.UPDATE_TYPE_MISMATCH: case Components.interfaces.nsIExtensionManager.UPDATE_TYPE_MISMATCH:
@ -277,6 +277,12 @@ nsExtensionManager.prototype = {
} }
}, },
getItemList: function (aItemID, aType, aCountRef)
{
this._ensureDS();
return this._ds.getItemList(aItemID, aType, aCountRef);
},
// Themes // Themes
installTheme: function (aThemeID) installTheme: function (aThemeID)
{ {
@ -321,8 +327,9 @@ nsExtensionManager.prototype = {
} }
}; };
function nsExtensionItemUpdater(aItems, aTargetAppID, aTargetAppVersion) function nsExtensionItemUpdater(aUpdateType, aItems, aTargetAppID, aTargetAppVersion)
{ {
this._updateType = aUpdateType;
this._items = aItems; this._items = aItems;
this._count = aItems.length; this._count = aItems.length;
this._appID = aTargetAppID; this._appID = aTargetAppID;
@ -343,6 +350,11 @@ nsExtensionItemUpdater.prototype = {
wspFactory.createProxyAsync("http://localhost:8080/axis/services/VersionCheck?wsdl", wspFactory.createProxyAsync("http://localhost:8080/axis/services/VersionCheck?wsdl",
"VersionCheck", "", true, this); "VersionCheck", "", true, this);
}, },
get updateType()
{
return this._updateType;
},
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// nsExtensionItemUpdater // nsExtensionItemUpdater
@ -456,6 +468,38 @@ nsExtensionsDataSource.prototype = {
return items; return items;
}, },
getItemList: function (aItemID, aType, aCountRef)
{
var items = [];
if (aItemID) {
var item = Components.classes["@mozilla.org/extensions/item;1"]
.createInstance(Components.interfaces.nsIExtensionItem);
item.init(aItemID, this.getExtensionProperty(aItemID, "version"),
this.getExtensionProperty(aItemID, "name"),
-1, "", "", aType);
items.push(item);
}
else {
var ctr = Components.classes["@mozilla.org/rdf/container;1"]
.createInstance(Components.interfaces.nsIRDFContainer);
ctr.Init(this, this._rdf.GetResource("urn:mozilla:extension:root"));
var elements = ctr.GetElements();
while (elements.hasMoreElements()) {
var e = elements.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
var id = this._stripPrefix(e.Value);
var item = Components.classes["@mozilla.org/extensions/item;1"]
.createInstance(Components.interfaces.nsIExtensionItem);
item.init(id, this.getExtensionProperty(id, "version"),
this.getExtensionProperty(id, "name"),
-1, "", "", aType);
items.push(item);
}
}
aCountRef.value = items.length;
return items;
},
_setProperty: function (aDS, aSource, aProperty, aNewValue) _setProperty: function (aDS, aSource, aProperty, aNewValue)
{ {
var oldValue = aDS.GetTarget(aSource, aProperty, true); var oldValue = aDS.GetTarget(aSource, aProperty, true);
@ -515,7 +559,11 @@ nsExtensionsDataSource.prototype = {
var key = aProfile ? "ProfD" : "ProfD"; // XXXben - XCurProcDir var key = aProfile ? "ProfD" : "ProfD"; // XXXben - XCurProcDir
var extensionsFile = fileLocator.get(key, Components.interfaces.nsIFile); var extensionsFile = fileLocator.get(key, Components.interfaces.nsIFile);
extensionsFile.append("extensions"); extensionsFile.append("extensions");
var extensionsDir = extensionsFile.clone(); var extensionsDir = extensionsFile.clone();
if (!extensionsDir.exists())
extensionsDir.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0755);
extensionsFile.append("extensions.rdf"); extensionsFile.append("extensions.rdf");
if (!extensionsFile.exists()) { if (!extensionsFile.exists()) {

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

@ -47,6 +47,7 @@ classic.jar:
skin/classic/mozapps/extensions/placeholder.gif (extensions/skin/placeholder.gif) skin/classic/mozapps/extensions/placeholder.gif (extensions/skin/placeholder.gif)
skin/classic/mozapps/extensions/viewWatermark.png (extensions/skin/viewWatermark.png) skin/classic/mozapps/extensions/viewWatermark.png (extensions/skin/viewWatermark.png)
skin/classic/mozapps/update/update.css (update/skin/update.css) skin/classic/mozapps/update/update.css (update/skin/update.css)
skin/classic/mozapps/update/warning.gif (update/skin/warning.gif)
skin/classic/mozapps/shared/richview.xml (shared/skin/richview.xml) skin/classic/mozapps/shared/richview.xml (shared/skin/richview.xml)
skin/classic/mozapps/shared/richview.css (shared/skin/richview.css) skin/classic/mozapps/shared/richview.css (shared/skin/richview.css)
skin/classic/mozapps/shared/viewFader.png (shared/skin/viewFader.png) skin/classic/mozapps/shared/viewFader.png (shared/skin/viewFader.png)

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

@ -42,25 +42,77 @@
// //
const nsIExtensionItem = Components.interfaces.nsIExtensionItem; const nsIExtensionItem = Components.interfaces.nsIExtensionItem;
const MISMATCH = Components.interfaces.nsIExtensionManager.UPDATE_TYPE_MISMATCH;
const USERINVOKED = Components.interfaces.nsIExtensionManager.UPDATE_TYPE_USERINVOKED;
var gExtensionItems = []; var gExtensionItems = [];
var gUpdater = null; var gUpdater = null;
var gUpdateWizard = { var gUpdateWizard = {
_items: [], // The items to check for updates for (e.g. an extension, some subset of extensions,
_itemsToUpdate: [], // all extensions, a list of compatible extensions, etc...)
items: [],
// The items that we found updates available for
itemsToUpdate: [],
// The items that we successfully installed updates for
updatedCount: 0,
shouldSuggestAutoChecking: false,
shouldAutoCheck: false,
init: function () init: function ()
{ {
gUpdater = window.arguments[0].QueryInterface(Components.interfaces.nsIExtensionItemUpdater); gUpdater = window.arguments[0].QueryInterface(Components.interfaces.nsIExtensionItemUpdater);
for (var i = 1; i < window.arguments.length; ++i) for (var i = 1; i < window.arguments.length; ++i)
this._items.push(window.arguments[i].QueryInterface(nsIExtensionItem)); this.items.push(window.arguments[i].QueryInterface(nsIExtensionItem));
var pref = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
this.shouldSuggestAutoChecking = (gUpdater.updateType == MISMATCH) &&
!pref.getBoolPref("update.extensions.enabled");
if (gUpdater.updateType == USERINVOKED) {
document.getElementById("mismatch").setAttribute("next", "checking");
document.documentElement.advance();
}
gMismatchPage.init(); gMismatchPage.init();
}, },
uninit: function () uninit: function ()
{ {
gUpdatePage.uninit(); gUpdatePage.uninit();
},
onWizardFinish: function ()
{
if (this.shouldSuggestAutoChecking) {
var pref = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
pref.setBoolPref("update.extensions.enabled", this.shouldAutoCheck);
}
},
setButtonLabels: function (aBackButton, aBackButtonIsDisabled,
aNextButton, aNextButtonIsDisabled,
aCancelButton, aCancelButtonIsDisabled)
{
var strings = document.getElementById("updateStrings");
var back = document.documentElement.getButton("back");
if (aBackButton)
back.label = strings.getString(aBackButton);
back.disabled = aBackButtonIsDisabled;
var next = document.documentElement.getButton("next");
if (aNextButton)
next.label = strings.getString(aNextButton);
next.disabled = aNextButtonIsDisabled;
var cancel = document.documentElement.getButton("cancel");
if (aCancelButton)
cancel.label = strings.getString(aCancelButton);
cancel.disabled = aCancelButtonIsDisabled;
} }
}; };
@ -69,24 +121,20 @@ var gMismatchPage = {
init: function () init: function ()
{ {
var incompatible = document.getElementById("mismatch.incompatible"); var incompatible = document.getElementById("mismatch.incompatible");
for (var i = 0; i < gUpdateWizard.items.length; ++i) {
for (var i = 0; i < gUpdateWizard._items.length; ++i) { var item = gUpdateWizard.items[i];
var item = gUpdateWizard._items[i];
var listitem = document.createElement("listitem"); var listitem = document.createElement("listitem");
listitem.setAttribute("label", item.name + " " + item.version); listitem.setAttribute("label", item.name + " " + item.version);
incompatible.appendChild(listitem); incompatible.appendChild(listitem);
} }
var strings = document.getElementById("updateStrings");
var next = document.documentElement.getButton("next");
next.label = strings.getString("mismatchCheckNow");
var cancel = document.documentElement.getButton("cancel");
cancel.label = strings.getString("mismatchDontCheck");
}, },
onPageAdvanced: function () onPageShow: function ()
{ {
dump("*** mismatch page advanced\n"); gUpdateWizard.setButtonLabels(null, true,
"mismatchCheckNow", false,
"mismatchDontCheck", false);
document.documentElement.getButton("next").focus();
} }
}; };
@ -100,15 +148,10 @@ var gUpdatePage = {
onPageShow: function () onPageShow: function ()
{ {
var strings = document.getElementById("updateStrings"); gUpdateWizard.setButtonLabels(null, true,
var next = document.documentElement.getButton("next"); "nextButtonText", true,
next.label = strings.getString("nextButtonText"); "cancelButtonText", true);
next.disabled = true; document.documentElement.getButton("next").focus();
var cancel = document.documentElement.getButton("cancel");
cancel.label = strings.getString("cancelButtonText");
cancel.disabled = true;
var back = document.documentElement.getButton("back");
back.disabled = true;
var os = Components.classes["@mozilla.org/observer-service;1"] var os = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService); .getService(Components.interfaces.nsIObserverService);
@ -134,17 +177,16 @@ var gUpdatePage = {
case "update-item-started": case "update-item-started":
break; break;
case "update-item-ended": case "update-item-ended":
dump("*** update-item-ended\n"); gUpdateWizard.itemsToUpdate.push(aSubject);
gUpdateWizard._itemsToUpdate.push(aSubject);
++this._completeCount; ++this._completeCount;
var progress = document.getElementById("checking.progress"); var progress = document.getElementById("checking.progress");
progress.value = Math.ceil(this._completeCount / gUpdateWizard._itemsToUpdate.length) * 100; progress.value = Math.ceil(this._completeCount / gUpdateWizard.itemsToUpdate.length) * 100;
break; break;
case "update-ended": case "update-ended":
if (gUpdateWizard._itemsToUpdate.length > 0) if (gUpdateWizard.itemsToUpdate.length > 0)
document.getElementById("checking").setAttribute("next", "found"); document.getElementById("checking").setAttribute("next", "found");
document.documentElement.advance(); document.documentElement.advance();
break; break;
@ -156,27 +198,76 @@ var gFoundPage = {
onPageShow: function () onPageShow: function ()
{ {
var strings = document.getElementById("updateStrings"); gUpdateWizard.setButtonLabels(null, true,
var next = document.documentElement.getButton("next"); "installButtonText", false,
next.label = strings.getString("installButtonText"); null, false);
next.disabled = false; document.documentElement.getButton("next").focus();
var back = document.documentElement.getButton("back");
back.disabled = true;
var list = document.getElementById("foundList"); var list = document.getElementById("foundList");
for (var i = 0; i < gUpdateWizard._itemsToUpdate.length; ++i) { for (var i = 0; i < gUpdateWizard.itemsToUpdate.length; ++i) {
var updateitem = document.createElement("updateitem"); var updateitem = document.createElement("updateitem");
list.appendChild(updateitem); list.appendChild(updateitem);
var item = gUpdateWizard._itemsToUpdate[i]; var item = gUpdateWizard.itemsToUpdate[i];
updateitem.name = item.name + " " + item.version; updateitem.name = item.name + " " + item.version;
updateitem.url = item.xpiURL; updateitem.url = item.xpiURL;
updateitem.checked = true;
if (item.iconURL != "") if (item.iconURL != "")
updateitem.icon = item.iconURL; updateitem.icon = item.iconURL;
} }
}, },
}; };
var gInstallingPage = {
onPageShow: function ()
{
gUpdateWizard.setButtonLabels(null, true,
"nextButtonText", true,
null, true);
// Get XPInstallManager and kick off download/install
// process, registering us as an observer.
//XXXben
window.advance = function()
{
document.getElementById("installing").setAttribute("next", "finished");
document.documentElement.advance();
}
setTimeout("advance()", 2000);
},
};
var gFinishedPage = {
onPageShow: function ()
{
gUpdateWizard.setButtonLabels(null, true, null, true, null, true);
document.documentElement.getButton("finish").focus();
var iR = document.getElementById("incompatibleRemaining");
var iR2 = document.getElementById("incompatibleRemaining2");
var fEC = document.getElementById("finishedEnableChecking");
if (gUpdateWizard.shouldSuggestAutoChecking) {
iR.hidden = true;
iR2.hidden = false;
fEC.hidden = false;
fEC.click();
}
else {
iR.hidden = false;
iR2.hidden = true;
fEC.hidden = true;
}
if (gUpdater.updateType == MISMATCH) {
document.getElementById("finishedMismatch").hidden = false;
}
}
};
# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- # -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-

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

@ -52,6 +52,7 @@
title="&updateWizard.title;" title="&updateWizard.title;"
onload="gUpdateWizard.init()" onload="gUpdateWizard.init()"
onunload="gUpdateWizard.uninit()" onunload="gUpdateWizard.uninit()"
onwizardfinish="gUpdateWizard.onWizardFinish();"
style="width: 40em;" style="width: 40em;"
buttons="accept,cancel"> buttons="accept,cancel">
@ -64,7 +65,7 @@
<wizardpage id="mismatch" pageid="mismatch" next="checking" <wizardpage id="mismatch" pageid="mismatch" next="checking"
label="&mismatch.title;" label="&mismatch.title;"
onpageadvanced="gMismatchPage.onPageAdvanced();"> onpageshow="gMismatchPage.onPageShow();">
<label>&mismatch.intro1.label;</label> <label>&mismatch.intro1.label;</label>
@ -101,8 +102,7 @@
<wizardpage id="found" pageid="found" next="installing" <wizardpage id="found" pageid="found" next="installing"
label="&found.title;" label="&found.title;"
onpageshow="gFoundPage.onPageShow();" onpageshow="gFoundPage.onPageShow();">
onpageadvanced="gFoundPage.onPageAdvanced();">
<label>&found.intro.label;</label> <label>&found.intro.label;</label>
@ -114,16 +114,34 @@
<wizardpage id="installing" pageid="installing" next="finished" <wizardpage id="installing" pageid="installing" next="finished"
label="&installing.title;" label="&installing.title;"
onpageshow="UpdateWizard.onFinishedPageShow();" onpageshow="gInstallingPage.onPageShow();">
onpageadvanced="UpdateWizard.onFinishedPageAdvanced();"> <label>&installing.intro.label;</label>
<label>&installing.disclaimer.label;</label>
<separator/>
</wizardpage> </wizardpage>
<wizardpage id="finished" pageid="finished" <wizardpage id="finished" pageid="finished"
label="&finished.title;" label="&finished.title;"
onpageshow="UpdateWizard.onFinishedPageShow();" onpageshow="gFinishedPage.onPageShow();">
onpageadvanced="UpdateWizard.onFinishedPageAdvanced();">
<label id="updated">&finished.updated.label;</label>
<separator/>
<hbox align="top">
<image id="alert"/>
<description id="incompatibleRemaining" flex="1">&finished.remaining.label;</description>
<description id="incompatibleRemaining2" flex="1">&finished.remaining2.label;</description>
</hbox>
<vbox align="left">
<checkbox class="indent" label="&finished.enableChecking.label;" id="finishedEnableChecking"
oncommand="gUpdateWizard.shouldAutoCheck = this.checked;"/>
</vbox>
<separator flex="1"/>
<label id="finishedMismatch" hidden="true">&finished.mismatch.label;</label>
</wizardpage> </wizardpage>
</wizard> </wizard>

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

@ -1,41 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE bindings SYSTEM "chrome://mozapps/locale/update/update.dtd">
<bindings id="updateItemBindings"
xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:xbl="http://www.mozilla.org/xbl">
<binding id="updateItem">
<resources>
<stylesheet src="chrome://mozapps/skin/update/update.css"/>
</resources>
<content>
<xul:hbox flex="1">
<xul:vbox align="center" pack="center">
<xul:image class="installItemIcon" xbl:inherits="src=icon"/>
</xul:vbox>
<xul:vbox flex="1">
<xul:hbox class="updateItemNameRow" align="center">
<xul:label class="updateItemName" xbl:inherits="value=name" flex="1" crop="right"/>
</xul:hbox>
<xul:hbox class="updateItemDetailsRow" align="center">
<xul:label class="updateItemFromLabel">&from.label;</xul:label>
<xul:textbox class="updateItemURL" xbl:inherits="value=url" flex="1" readonly="true" crop="right"/>
</xul:hbox>
</xul:vbox>
</xul:hbox>
</content>
<implementation>
<property name="name" onset="this.setAttribute('name', val); return val;"
onget="return this.getAttribute('name');"/>
<property name="url" onset="this.setAttribute('url', val); return val;"
onget="return this.getAttribute('url');"/>
<property name="icon" onset="this.setAttribute('icon', val); return val;"
onget="return this.getAttribute('icon');"/>
</implementation>
</binding>
</bindings>

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

@ -11,15 +11,39 @@
<!ENTITY checking.title "Checking for Updates"> <!ENTITY checking.title "Checking for Updates">
<!ENTITY checking.intro.label "&brandShortName; is now checking for available updates..."> <!ENTITY checking.intro.label "&brandShortName; is now checking for available updates...">
<!ENTITY noupdates.title "No Updates Found">
<!ENTITY found.title "Updates Found"> <!ENTITY found.title "Updates Found">
<!ENTITY found.intro.label "&brandShortName; found the following available updates:"> <!ENTITY found.intro.label "&brandShortName; found the following available updates:">
<!ENTITY found.instructions.label "Choose the ones you want to install and click Install Now to install them."> <!ENTITY found.instructions.label "Choose the ones you want to install and click Install Now to install them.">
<!ENTITY from.label "from: ">
<!ENTITY installing.title "Installing Updates"> <!ENTITY installing.title "Installing Updates">
<!ENTITY installing.intro.label "Now downloading and installing updates...">
<!ENTITY installing.disclaimer.label "XXXben - this will not work until we have a scriptable API to XPInstall.">
<!ENTITY finished.title "Done"> <!ENTITY noupdates.title "No Updates Found">
<!ENTITY noupdates.intro.user.label "&brandShortName; was not able to find any available updates.">
<!ENTITY noupdates.intro2.user.label "&brandShortName; will check periodically and inform you when
updates become available.">
<!ENTITY noupdates.intro3.user.label "&brandShortName; can check periodically and inform you when
updates become available.">
<!ENTITY from.label "from: "> <!ENTITY noupdates.intro.mismatch.label "&brandShortName; was not able to find any available updates -
compatible versions may not be available at this time.">
<!ENTITY noupdates.intro2.mismatch.label "&brandShortName; will check periodically and inform you when
compatible versions become available.">
<!ENTITY noupdates.intro3.mismatch.label "&brandShortName; can check periodically and inform you when
compatible versions become available.">
<!ENTITY noupdates.enableChecking.label "Allow &brandShortName; to check for updates.">
<!ENTITY finished.title "Update Complete">
<!ENTITY finished.updated.label "&brandShortName; has installed the available updates.">
<!ENTITY finished.remaining.label "Some incompatible extensions could not be updated, perhaps
because compatible versions are not available at this time.
&brandShortName; will check periodically and inform you
when updated versions become available.">
<!ENTITY finished.remaining2.label "Some incompatible extensions could not be updated, perhaps
because compatible versions are not available at this time.
&brandShortName; can check periodically and inform you
when updated versions become available.">
<!ENTITY finished.enableChecking.label "Allow &brandShortName; to check for updates.">
<!ENTITY finished.mismatch.label "Click Finish to continue starting &brandShortName;.">

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

@ -35,7 +35,24 @@ updateitem {
background-color: Window; background-color: Window;
} }
.updateItemFromLabel {
padding-top: 2px;
}
.updateItemIcon { .updateItemIcon {
list-style-image: url("chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png"); list-style-image: url("chrome://mozapps/skin/xpinstall/xpinstallItemGeneric.png");
} }
.updateItemChecked {
margin: 0px 0px 3px 0px;
padding: 0px;
}
.updateItemChecked .checkbox-label-box {
display: none;
}
#alert {
list-style-image: url("chrome://mozapps/skin/update/warning.gif");
}

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