зеркало из https://github.com/mozilla/gecko-dev.git
Bug 297903: Extension updates should link to further information. r=robstrong
This commit is contained in:
Родитель
b2aaa876db
Коммит
1359bb6e2c
|
@ -76,6 +76,12 @@
|
|||
<!ENTITY cmd.installUpdate.label "Install Update">
|
||||
<!ENTITY cmd.installUpdate.accesskey "I">
|
||||
<!ENTITY cmd.installUpdate.tooltip "Install an update for this Add-on">
|
||||
<!ENTITY cmd.showUpdateInfo.label "Show Information">
|
||||
<!ENTITY cmd.showUpdateInfo.accesskey "S">
|
||||
<!ENTITY cmd.showUpdateInfo.tooltip "Show more information about these updates">
|
||||
<!ENTITY cmd.hideUpdateInfo.label "Hide Information">
|
||||
<!ENTITY cmd.hideUpdateInfo.accesskey "H">
|
||||
<!ENTITY cmd.hideUpdateInfo.tooltip "Hide information about these updates">
|
||||
<!-- The selected add-on's cancel action button label -->
|
||||
<!ENTITY cancel.label "Cancel">
|
||||
<!ENTITY cancel.accesskey "C">
|
||||
|
@ -114,6 +120,9 @@
|
|||
<!ENTITY previewNoThemeSelected.label "No Theme Selected">
|
||||
<!ENTITY previewNoPreviewImage.label "This Theme does not have a Preview Image">
|
||||
<!ENTITY moreInfo.label "More Information">
|
||||
<!ENTITY infoNoAddonSelected.label "No Update Selected">
|
||||
<!ENTITY infoNoUpdateInfo.label "This update does not have any additional information">
|
||||
<!ENTITY infoUpdateInfoError.label "There was an error loading the information about this update">
|
||||
|
||||
<!ENTITY updateSuccess.label "Update completed successfully.">
|
||||
<!ENTITY installSuccess.label "Install completed successfully.">
|
||||
|
|
|
@ -22,7 +22,8 @@
|
|||
# Ben Goodger <ben@mozilla.org>
|
||||
# Robert Strong <robert.bugzilla@gmail.com>
|
||||
# Dão Gottwald <dao@design-noir.de>
|
||||
#
|
||||
# Dave Townsend <dtownsend@oxymoronical.com>
|
||||
#
|
||||
# Alternatively, the contents of this file may be used under the terms of
|
||||
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
|
@ -78,10 +79,11 @@ 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:";
|
||||
const PREFIX_NS_EM = "http://www.mozilla.org/2004/em-rdf#";
|
||||
const kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||
const RDFURI_ITEM_ROOT = "urn:mozilla:item:root";
|
||||
const PREFIX_ITEM_URI = "urn:mozilla:item:";
|
||||
const PREFIX_NS_EM = "http://www.mozilla.org/2004/em-rdf#";
|
||||
const kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||
const XMLURI_PARSE_ERROR = "http://www.mozilla.org/newlayout/xml/parsererror.xml"
|
||||
|
||||
const OP_NONE = "";
|
||||
const OP_NEEDS_INSTALL = "needs-install";
|
||||
|
@ -315,6 +317,7 @@ function showView(aView) {
|
|||
bindingList = [ ["aboutURL", "?aboutURL"],
|
||||
["availableUpdateURL", "?availableUpdateURL"],
|
||||
["availableUpdateVersion", "?availableUpdateVersion"],
|
||||
["availableUpdateInfo", "?availableUpdateInfo"],
|
||||
["blocklisted", "?blocklisted"],
|
||||
["homepageURL", "?homepageURL"],
|
||||
["iconURL", "?iconURL"],
|
||||
|
@ -406,6 +409,8 @@ function showView(aView) {
|
|||
document.getElementById("continueDialogButton").hidden = !showContinue;
|
||||
document.getElementById("themePreviewArea").hidden = !isThemes;
|
||||
document.getElementById("themeSplitter").hidden = !isThemes;
|
||||
document.getElementById("showUpdateInfoButton").hidden = aView != "updates";
|
||||
document.getElementById("hideUpdateInfoButton").hidden = true;
|
||||
|
||||
AddonsViewBuilder.updateView(types, "richlistitem", bindingList, null);
|
||||
|
||||
|
@ -1111,24 +1116,146 @@ function onAddonSelect(aEvent)
|
|||
|
||||
if (!document.getElementById("themePreviewArea").hidden) {
|
||||
var previewImageDeck = document.getElementById("previewImageDeck");
|
||||
var previewImage = document.getElementById("previewImage");
|
||||
if (!gExtensionsView.selectedItem) {
|
||||
previewImageDeck.setAttribute("selectedIndex", "0");
|
||||
if (previewImage.hasAttribute("src"))
|
||||
previewImage.removeAttribute("src");
|
||||
}
|
||||
else {
|
||||
var url = gExtensionsView.selectedItem.getAttribute("previewImage");
|
||||
if (url) {
|
||||
previewImageDeck.setAttribute("selectedIndex", "2");
|
||||
previewImage.setAttribute("src", url);
|
||||
}
|
||||
else {
|
||||
previewImageDeck.setAttribute("selectedIndex", "1");
|
||||
if (gView == "themes") {
|
||||
var previewImage = document.getElementById("previewImage");
|
||||
if (!gExtensionsView.selectedItem) {
|
||||
previewImageDeck.selectedIndex = 0;
|
||||
if (previewImage.hasAttribute("src"))
|
||||
previewImage.removeAttribute("src");
|
||||
}
|
||||
else {
|
||||
var url = gExtensionsView.selectedItem.getAttribute("previewImage");
|
||||
if (url) {
|
||||
previewImageDeck.selectedIndex = 2;
|
||||
previewImage.setAttribute("src", url);
|
||||
}
|
||||
else {
|
||||
previewImageDeck.selectedIndex = 1;
|
||||
if (previewImage.hasAttribute("src"))
|
||||
previewImage.removeAttribute("src");
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (gView == "updates") {
|
||||
UpdateInfoLoader.cancelLoad();
|
||||
if (!gExtensionsView.selectedItem)
|
||||
previewImageDeck.selectedIndex = 3;
|
||||
else if (!gExtensionsView.selectedItem.hasAttribute("availableUpdateInfo"))
|
||||
previewImageDeck.selectedIndex = 4;
|
||||
else
|
||||
UpdateInfoLoader.loadInfo(gExtensionsView.selectedItem.getAttribute("availableUpdateInfo"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Manages the retrieval of update information and the xsl stylesheet
|
||||
* used to format the inforation into chrome.
|
||||
*/
|
||||
var UpdateInfoLoader = {
|
||||
_stylesheet: null,
|
||||
_styleRequest: null,
|
||||
_infoDocument: null,
|
||||
_infoRequest: null,
|
||||
|
||||
// Called once both stylesheet and info requests have completed
|
||||
displayInfo: function()
|
||||
{
|
||||
var processor = Components.classes["@mozilla.org/document-transformer;1?type=xslt"]
|
||||
.createInstance(Components.interfaces.nsIXSLTProcessor);
|
||||
processor.flags |= Components.interfaces.nsIXSLTProcessorPrivate.DISABLE_ALL_LOADS;
|
||||
|
||||
processor.importStylesheet(this._stylesheet);
|
||||
var fragment = processor.transformToFragment(this._infoDocument, document);
|
||||
document.getElementById("infoDisplay").appendChild(fragment);
|
||||
document.getElementById("previewImageDeck").selectedIndex = 7;
|
||||
},
|
||||
|
||||
onStylesheetLoaded: function(event)
|
||||
{
|
||||
var request = event.target;
|
||||
this._styleRequest = null;
|
||||
this._stylesheet = request.responseXML;
|
||||
|
||||
if (!this._stylesheet ||
|
||||
this._stylesheet.documentElement.namespaceURI == XMLURI_PARSE_ERROR ||
|
||||
(request.status != 200 && request.status != 0)) {
|
||||
// The stylesheet load failing is a bad sign
|
||||
document.getElementById("previewImageDeck").selectedIndex = 6;
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._infoDocument)
|
||||
this.displayInfo();
|
||||
},
|
||||
|
||||
onInfoLoaded: function(event)
|
||||
{
|
||||
var request = event.target;
|
||||
this._infoRequest = null;
|
||||
this._infoDocument = request.responseXML;
|
||||
|
||||
if (!this._infoDocument ||
|
||||
this._infoDocument.documentElement.namespaceURI == XMLURI_PARSE_ERROR ||
|
||||
(request.status != 200 && request.status != 0)) {
|
||||
// Should attempt to parse request.responseText with the html parser
|
||||
document.getElementById("previewImageDeck").selectedIndex = 6;
|
||||
return;
|
||||
}
|
||||
|
||||
if (this._stylesheet)
|
||||
this.displayInfo();
|
||||
},
|
||||
|
||||
onError: function(event)
|
||||
{
|
||||
if (event.request == this._infoRequest)
|
||||
this._infoRequest = null;
|
||||
else // Means the stylesheet load has failed which is pretty bad news
|
||||
this.cancelRequest();
|
||||
|
||||
document.getElementById("previewImageDeck").selectedIndex = 6;
|
||||
},
|
||||
|
||||
loadInfo: function(url)
|
||||
{
|
||||
this.cancelLoad();
|
||||
this._infoDocument = null;
|
||||
document.getElementById("previewImageDeck").selectedIndex = 5;
|
||||
var display = document.getElementById("infoDisplay");
|
||||
while (display.lastChild)
|
||||
display.removeChild(display.lastChild);
|
||||
|
||||
this._infoRequest = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
|
||||
.createInstance(Components.interfaces.nsIXMLHttpRequest);
|
||||
this._infoRequest.open("GET", url, true);
|
||||
|
||||
var self = this;
|
||||
this._infoRequest.onerror = function(event) { self.onError(event); };
|
||||
this._infoRequest.onload = function(event) { self.onInfoLoaded(event); };
|
||||
this._infoRequest.send(null);
|
||||
|
||||
// We may have the stylesheet cached from a previous load, or may still be
|
||||
// loading it.
|
||||
if (this._stylesheet || this._styleRequest)
|
||||
return;
|
||||
|
||||
this._styleRequest = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
|
||||
.createInstance(Components.interfaces.nsIXMLHttpRequest);
|
||||
this._styleRequest.open("GET", "chrome://mozapps/content/extensions/updateinfo.xsl", true);
|
||||
this._styleRequest.overrideMimeType("text/xml");
|
||||
|
||||
this._styleRequest.onerror = function(event) { self.onError(event); };
|
||||
this._styleRequest.onload = function(event) { self.onStylesheetLoaded(event); };
|
||||
this._styleRequest.send(null);
|
||||
},
|
||||
|
||||
cancelLoad: function()
|
||||
{
|
||||
// Leave the stylesheet loader running, there's a good chance we'll need it
|
||||
if (this._infoRequest)
|
||||
this._infoRequest.abort();
|
||||
this._infoRequest = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1531,6 +1658,24 @@ function updateGlobalCommands() {
|
|||
setElementDisabledByID("cmd_installFile", disableInstallFile);
|
||||
}
|
||||
|
||||
function showUpdateInfo()
|
||||
{
|
||||
document.getElementById("themePreviewArea").hidden = false;
|
||||
document.getElementById("themeSplitter").hidden = false;
|
||||
document.getElementById("showUpdateInfoButton").hidden = true;
|
||||
document.getElementById("hideUpdateInfoButton").hidden = false;
|
||||
onAddonSelect();
|
||||
}
|
||||
|
||||
function hideUpdateInfo()
|
||||
{
|
||||
UpdateInfoLoader.cancelLoad();
|
||||
document.getElementById("themePreviewArea").hidden = true;
|
||||
document.getElementById("themeSplitter").hidden = true;
|
||||
document.getElementById("showUpdateInfoButton").hidden = false;
|
||||
document.getElementById("hideUpdateInfoButton").hidden = true;
|
||||
}
|
||||
|
||||
function checkUpdatesAll() {
|
||||
if (isOffline("offlineUpdateMsg"))
|
||||
return;
|
||||
|
|
|
@ -481,12 +481,12 @@
|
|||
<xul:hbox>
|
||||
<xul:description xbl:inherits="value=updateAvailableMsg" flex="1" crop="end"/>
|
||||
</xul:hbox>
|
||||
<xul:hbox pack="end" align="end">
|
||||
<xul:checkbox anonid="includeUpdate" class="includeUpdate" checked="true"
|
||||
label="&includeUpdate.label;" tooltiptext="&includeUpdate.tooltip;"
|
||||
includeUpdateAccesskey="&includeUpdate.accesskey;" accesskey="&includeUpdate.accesskey;"/>
|
||||
</xul:hbox>
|
||||
</xul:vbox>
|
||||
<xul:hbox pack="end" align="end">
|
||||
<xul:checkbox anonid="includeUpdate" class="includeUpdate" checked="true"
|
||||
label="&includeUpdate.label;" tooltiptext="&includeUpdate.tooltip;"
|
||||
includeUpdateAccesskey="&includeUpdate.accesskey;" accesskey="&includeUpdate.accesskey;"/>
|
||||
</xul:hbox>
|
||||
</xul:hbox>
|
||||
</content>
|
||||
|
||||
|
|
|
@ -110,6 +110,8 @@
|
|||
<command id="cmd_restartApp" oncommand="restartApp();"/>
|
||||
<command id="cmd_continue" oncommand="closeEM();" disabled="true"/>
|
||||
<command id="cmd_close" oncommand="closeEM();"/>
|
||||
<command id="cmd_showUpdateInfo" oncommand="showUpdateInfo();"/>
|
||||
<command id="cmd_hideUpdateInfo" oncommand="hideUpdateInfo();"/>
|
||||
</commandset>
|
||||
|
||||
<vbox id="addonContextMenuPalette" hidden="true">
|
||||
|
@ -193,6 +195,20 @@
|
|||
<image id="previewImage"/>
|
||||
</description>
|
||||
</vbox>
|
||||
<vbox id="infoNoAddonSelected" align="center" pack="center">
|
||||
<label class="previewText">&infoNoAddonSelected.label;</label>
|
||||
</vbox>
|
||||
<vbox id="infoNoUpdateInfo" align="center" pack="center">
|
||||
<label class="previewText">&infoNoUpdateInfo.label;</label>
|
||||
</vbox>
|
||||
<vbox id="infoLoadingInfo" align="center" pack="center">
|
||||
<image class="addonThrobber"/>
|
||||
</vbox>
|
||||
<vbox id="infoUpdateInfoError" align="center" pack="center">
|
||||
<label class="previewText">&infoUpdateInfoError.label;</label>
|
||||
</vbox>
|
||||
<vbox id="infoDisplay">
|
||||
</vbox>
|
||||
</deck>
|
||||
</vbox>
|
||||
</hbox>
|
||||
|
@ -208,6 +224,14 @@
|
|||
accesskey="&cmd.installUpdatesAll.accesskey;"
|
||||
tooltiptext="&cmd.installUpdatesAll.tooltip;"
|
||||
command="cmd_installUpdatesAll"/>
|
||||
<button id="showUpdateInfoButton" label="&cmd.showUpdateInfo.label;"
|
||||
accesskey="&cmd.showUpdateInfo.accesskey;"
|
||||
tooltiptext="&cmd.showUpdateInfo.tooltip;"
|
||||
command="cmd_showUpdateInfo"/>
|
||||
<button id="hideUpdateInfoButton" label="&cmd.hideUpdateInfo.label;"
|
||||
accesskey="&cmd.hideUpdateInfo.accesskey;"
|
||||
tooltiptext="&cmd.hideUpdateInfo.tooltip;"
|
||||
command="cmd_hideUpdateInfo"/>
|
||||
<button id="checkUpdatesAllButton" label="&cmd.checkUpdatesAll.label;"
|
||||
accesskey="&cmd.checkUpdatesAll.accesskey;"
|
||||
tooltiptextaddons="&cmd.checkUpdatesAllAddon.tooltip;"
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xsl:stylesheet version="1.0" xmlns:xhtml="http://www.w3.org/1999/xhtml"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
|
||||
<xsl:template match="text()">
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="text()" mode="list">
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="text()" mode="text">
|
||||
<xsl:value-of select="."/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="xhtml:script" mode="text">
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="xhtml:b|xhtml:i|xhtml:em|xhtml:strong" mode="text">
|
||||
<xsl:copy><xsl:apply-templates mode="text"/></xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="xhtml:h1|xhtml:h2|xhtml:h3|xhtml:p">
|
||||
<xsl:copy><xsl:apply-templates mode="text"/></xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="xhtml:li" mode="list">
|
||||
<xsl:copy><xsl:apply-templates mode="text"/></xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="xhtml:ul|xhtml:ol">
|
||||
<xsl:copy><xsl:apply-templates mode="list"/></xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="/">
|
||||
<xhtml:body><xsl:apply-templates/></xhtml:body>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
|
@ -3,6 +3,7 @@ toolkit.jar:
|
|||
* content/mozapps/extensions/extensions.xul (content/extensions.xul)
|
||||
* content/mozapps/extensions/extensions.js (content/extensions.js)
|
||||
* content/mozapps/extensions/extensions.xml (content/extensions.xml)
|
||||
content/mozapps/extensions/updateinfo.xsl (content/updateinfo.xsl)
|
||||
content/mozapps/extensions/extensions.css (content/extensions.css)
|
||||
* content/mozapps/extensions/about.xul (content/about.xul)
|
||||
* content/mozapps/extensions/about.js (content/about.js)
|
||||
|
|
|
@ -4480,7 +4480,8 @@ ExtensionManager.prototype = {
|
|||
type : EM_I(type),
|
||||
availableUpdateURL : null,
|
||||
availableUpdateHash : null,
|
||||
availableUpdateVersion: null };
|
||||
availableUpdateVersion: null,
|
||||
availableUpdateInfo : null };
|
||||
for (var p in props)
|
||||
ds.setItemProperty(id, EM_R(p), props[p]);
|
||||
ds.updateProperty(id, "availableUpdateURL");
|
||||
|
@ -4520,7 +4521,8 @@ ExtensionManager.prototype = {
|
|||
newVersion : EM_L(getManifestProperty(installManifest, "version")),
|
||||
availableUpdateURL : null,
|
||||
availableUpdateHash : null,
|
||||
availableUpdateVersion : null };
|
||||
availableUpdateVersion : null,
|
||||
availableUpdateInfo : null };
|
||||
for (var p in props)
|
||||
ds.setItemProperty(id, EM_R(p), props[p]);
|
||||
ds.updateProperty(id, "availableUpdateURL");
|
||||
|
@ -5392,6 +5394,7 @@ ExtensionManager.prototype = {
|
|||
ds.setItemProperty(id, EM_R("availableUpdateURL"), null);
|
||||
ds.setItemProperty(id, EM_R("availableUpdateHash"), null);
|
||||
ds.setItemProperty(id, EM_R("availableUpdateVersion"), null);
|
||||
ds.setItemProperty(id, EM_R("availableUpdateInfo"), null);
|
||||
ds.updateProperty(id, "availableUpdateURL");
|
||||
ds.updateProperty(id, "updateable");
|
||||
}
|
||||
|
@ -6474,6 +6477,15 @@ RDFItemUpdater.prototype = {
|
|||
appID);
|
||||
|
||||
if (this._updater._isValidUpdate(aLocalItem, updatedItem)) {
|
||||
if (aUpdateCheckType == nsIExtensionManager.UPDATE_CHECK_NEWVERSION) {
|
||||
var infourl = this._getPropertyFromResource(aDataSource, targetApp,
|
||||
"updateInfoURL");
|
||||
if (infourl)
|
||||
infourl = EM_L(infourl);
|
||||
this._updater._emDS.setItemProperty(aLocalItem.id,
|
||||
EM_R("availableUpdateInfo"),
|
||||
infourl);
|
||||
}
|
||||
if (appID == this._updater._appID) {
|
||||
// App takes precedence over toolkit. If we found the app, bail out.
|
||||
return updatedItem;
|
||||
|
|
|
@ -284,3 +284,45 @@ radio#installs-view:hover, radio#installs-view[selected="true"] {
|
|||
richlistitem[selected="true"] .includeUpdate {
|
||||
-moz-user-focus: normal;
|
||||
}
|
||||
|
||||
#infoDisplay {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
#infoDisplay body {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
#infoDisplay h1,
|
||||
#infoDisplay h2,
|
||||
#infoDisplay h3 {
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
margin: 0 0 0.7em 0;
|
||||
}
|
||||
|
||||
#infoDisplay h1 {
|
||||
font-size: 150%;
|
||||
}
|
||||
|
||||
#infoDisplay h2 {
|
||||
font-size: 125%;
|
||||
}
|
||||
|
||||
#infoDisplay h3 {
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
#infoDisplay ol,
|
||||
#infoDisplay ul {
|
||||
margin: 0 0 0.7em 0;
|
||||
}
|
||||
|
||||
#infoDisplay li {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#infoDisplay p {
|
||||
text-align: justify;
|
||||
margin: 0 0 0.7em 0;
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ margin-top: -12px;
|
|||
-moz-image-region: rect(21px, 84px, 42px, 63px);
|
||||
}
|
||||
|
||||
#checkUpdatesAllButton {
|
||||
#checkUpdatesAllButton, #showUpdateInfoButton, #hideUpdateInfoButton {
|
||||
-moz-image-region: rect(0px, 63px, 21px, 42px);
|
||||
}
|
||||
#checkUpdatesAllButton[disabled="true"] {
|
||||
|
@ -351,3 +351,45 @@ radio#installs-view:hover, radio#installs-view[selected="true"] {
|
|||
richlistitem[selected="true"] .includeUpdate {
|
||||
-moz-user-focus: normal;
|
||||
}
|
||||
|
||||
#infoDisplay {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
#infoDisplay body {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
#infoDisplay h1,
|
||||
#infoDisplay h2,
|
||||
#infoDisplay h3 {
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
margin: 0 0 0.7em 0;
|
||||
}
|
||||
|
||||
#infoDisplay h1 {
|
||||
font-size: 150%;
|
||||
}
|
||||
|
||||
#infoDisplay h2 {
|
||||
font-size: 125%;
|
||||
}
|
||||
|
||||
#infoDisplay h3 {
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
#infoDisplay ol,
|
||||
#infoDisplay ul {
|
||||
margin: 0 0 0.7em 0;
|
||||
}
|
||||
|
||||
#infoDisplay li {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#infoDisplay p {
|
||||
text-align: justify;
|
||||
margin: 0 0 0.7em 0;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче