Fix for bug 304362: makes feedview parse W3C-DTF dates correctly; also, fixes several regressions from the checkin for bug 303848, specifically: uncomments call to Feed.init() so feeds get initialized (and dates show up and refresh works); calls the refresh function appropriately so refresh works; disables refresh by default; adds back menu display and refresh prefs; makes refresh pref refer to minutes rather than seconds; and looks for prefs in DOM by correct name (all lowercase, since XSLT forces them to that) so the menu shows up and refresh works. r=mconnor, sr=beng
git-svn-id: svn://10.0.0.236/trunk@177790 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
3ac67092d5
commit
2f0aef9c5c
@ -404,8 +404,5 @@ pref("browser.download.hide_plugins_without_extensions", true);
|
||||
// to be exposed. By default, only expose it for bidi-associated system locales.
|
||||
pref("bidi.browser.ui", false);
|
||||
|
||||
pref("browser.feedview.articleLength", 50);
|
||||
pref("browser.feedview.showBar", true);
|
||||
pref("browser.feedview.showImage", true);
|
||||
pref("browser.feedview.timerInterval", 0);
|
||||
pref("browser.feedview.externalCSS", "");
|
||||
pref("browser.feedview.showMenu", true);
|
||||
pref("browser.feedview.reloadInterval", 0);
|
||||
|
||||
@ -6195,6 +6195,24 @@ var FeedHandler = {
|
||||
*/
|
||||
function transformFeed(processor) {
|
||||
var strings = document.getElementById("bundle_browser");
|
||||
|
||||
// Get the values of the reloadInterval and showMenu preferences
|
||||
// or fall back on hardcoded values.
|
||||
var reloadInterval, showMenu;
|
||||
if (gPrefService) {
|
||||
try {
|
||||
reloadInterval =
|
||||
gPrefService.getIntPref("browser.feedview.reloadInterval");
|
||||
} catch (e) {
|
||||
reloadinterval = 0;
|
||||
}
|
||||
try {
|
||||
showMenu = gPrefService.getBoolPref("browser.feedview.showMenu");
|
||||
} catch (e) {
|
||||
showMenu = true;
|
||||
}
|
||||
}
|
||||
|
||||
processor.setParameter(null, "url", doc.documentURI);
|
||||
processor.setParameter(null, "title",
|
||||
strings.getFormattedString("feedTitle", [""]));
|
||||
@ -6210,8 +6228,9 @@ var FeedHandler = {
|
||||
processor.setParameter(null, "articleCount",
|
||||
strings.getFormattedString("feedDescription",
|
||||
[getArticleCount()]));
|
||||
processor.setParameter(null, "showMenu", true);
|
||||
processor.setParameter(null, "reloadInterval", 30);
|
||||
processor.setParameter(null, "showMenu", showMenu);
|
||||
|
||||
processor.setParameter(null, "reloadInterval", reloadInterval);
|
||||
processor.setParameter(null, "addLiveBookmarkLink",
|
||||
strings.getString("feedAddLiveBookmarkLink"));
|
||||
var regionStrings = document.getElementById("bundle_browser_region");
|
||||
@ -6312,5 +6331,5 @@ var FeedHandler = {
|
||||
// making sure to specify the strictest check that matches that pattern
|
||||
// to minimize false positives.
|
||||
return false;
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
*
|
||||
* Contributor(s):
|
||||
* Ben Goodger <ben@mozilla.org>
|
||||
* Myk Melez <myk@mozilla.org>
|
||||
*
|
||||
* 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
|
||||
@ -37,17 +38,93 @@
|
||||
|
||||
var FeedView = {
|
||||
/**
|
||||
* Attempt to get a JavaScript Date object from a string
|
||||
* @param str
|
||||
* A string that may contain a formatted date
|
||||
* @returns A JavaScript Date object representing the date
|
||||
* Converts a W3C-DTF (subset of ISO 8601) date string to an IETF date string.
|
||||
* @param dateString
|
||||
* A string that may contain a W3C-DTF date string
|
||||
* @returns an IETF date string
|
||||
*/
|
||||
_xmlDate: function(str) {
|
||||
str = str.replace("Z", "+00:00");
|
||||
var d = str.replace(/^(\d{4})-(\d\d)-(\d\d)T([0-9:]*)([.0-9]*)(.)(\d\d):(\d\d)$/, '$1/$2/$3 $4 $6$7$8');
|
||||
d = Date.parse(d);
|
||||
d += 1000 * RegExp.$5;
|
||||
return new Date(d);
|
||||
_W3CToIETFDate: function(dateString) {
|
||||
// W3C-DTF is described in this note: http://www.w3.org/TR/NOTE-datetime
|
||||
// IETF is obtained via the Date object's toUTCString() method. The object's
|
||||
// toString() method is insufficient because it spells out timezones on Win32
|
||||
// (f.e. "Pacific Standard Time" instead of "PST"), which Mail doesn't grok.
|
||||
// For info, see http://lxr.mozilla.org/mozilla/source/js/src/jsdate.c#1654.
|
||||
|
||||
const HOURS_TO_MINUTES = 60;
|
||||
const MINUTES_TO_SECONDS = 60;
|
||||
const SECONDS_TO_MILLISECONDS = 1000;
|
||||
const MINUTES_TO_MILLISECONDS = MINUTES_TO_SECONDS * SECONDS_TO_MILLISECONDS;
|
||||
const HOURS_TO_MILLISECONDS = HOURS_TO_MINUTES * MINUTES_TO_MILLISECONDS;
|
||||
|
||||
var parts = dateString.match(/(\d\d\d\d)(-(\d\d))?(-(\d\d))?(T(\d\d):(\d\d)(:(\d\d)(\.(\d+))?)?(Z|([+-])(\d\d):(\d\d))?)?/);
|
||||
|
||||
// Here's an example of a W3C-DTF date string and what .match returns for it.
|
||||
// date: 2003-05-30T11:18:50.345-08:00
|
||||
// date.match returns array values:
|
||||
// 0: 2003-05-30T11:18:50-08:00,
|
||||
// 1: 2003,
|
||||
// 2: -05,
|
||||
// 3: 05,
|
||||
// 4: -30,
|
||||
// 5: 30,
|
||||
// 6: T11:18:50-08:00,
|
||||
// 7: 11,
|
||||
// 8: 18,
|
||||
// 9: :50,
|
||||
// 10: 50,
|
||||
// 11: .345,
|
||||
// 12: 345,
|
||||
// 13: -08:00,
|
||||
// 14: -,
|
||||
// 15: 08,
|
||||
// 16: 00
|
||||
|
||||
// Create a Date object from the date parts. Note that the Date object
|
||||
// apparently can't deal with empty string parameters in lieu of numbers,
|
||||
// so optional values (like hours, minutes, seconds, and milliseconds)
|
||||
// must be forced to be numbers.
|
||||
var date = new Date(parts[1], parts[3]-1, parts[5], parts[7] || 0,
|
||||
parts[8] || 0, parts[10] || 0, parts[12] || 0);
|
||||
|
||||
// We now have a value that the Date object thinks is in the local timezone
|
||||
// but which actually represents the date/time in the remote timezone
|
||||
// (f.e. the value was "10:00 EST", and we have converted it to "10:00 PST"
|
||||
// instead of "07:00 PST"). We need to correct that. To do so, we're going
|
||||
// to add the offset between the remote timezone and UTC (to convert the value
|
||||
// to UTC), then add the offset between UTC and the local timezone (to convert
|
||||
// the value to the local timezone).
|
||||
|
||||
// Ironically, W3C-DTF gives us the offset between UTC and the remote timezone
|
||||
// rather than the other way around, while the getTimezoneOffset() method
|
||||
// of a Date object gives us the offset between the local timezone and UTC
|
||||
// rather than the other way around. Both of these are the additive inverse
|
||||
// (i.e. -x for x) of what we want, so we have to invert them to use them
|
||||
// by multipying by -1
|
||||
// (f.e. if "the offset between UTC and the remote timezone" is -5 hours,
|
||||
// then "the offset between the remote timezone and UTC" is -5*-1 = 5 hours).
|
||||
|
||||
// Note that if the timezone portion of the date/time string is absent
|
||||
// (which violates W3C-DTF, although ISO 8601 allows it), we assume the value
|
||||
// to be in UTC.
|
||||
|
||||
// The offset between the remote timezone and UTC in milliseconds.
|
||||
var remoteToUTCOffset = 0;
|
||||
if (parts[13] && parts[13] != "Z") {
|
||||
var direction = (parts[14] == "+" ? 1 : -1);
|
||||
if (parts[15])
|
||||
remoteToUTCOffset += direction * parts[15] * HOURS_TO_MILLISECONDS;
|
||||
if (parts[16])
|
||||
remoteToUTCOffset += direction * parts[16] * MINUTES_TO_MILLISECONDS;
|
||||
}
|
||||
remoteToUTCOffset = remoteToUTCOffset * -1; // invert it
|
||||
|
||||
// The offset between UTC and the local timezone in milliseconds.
|
||||
var UTCToLocalOffset = date.getTimezoneOffset() * MINUTES_TO_MILLISECONDS;
|
||||
UTCToLocalOffset = UTCToLocalOffset * -1; // invert it
|
||||
|
||||
date.setTime(date.getTime() + remoteToUTCOffset + UTCToLocalOffset);
|
||||
|
||||
return date.toUTCString();
|
||||
},
|
||||
|
||||
/**
|
||||
@ -60,9 +137,12 @@ var FeedView = {
|
||||
var d = divs[i].getAttribute("date");
|
||||
dump("*** D = " + d + "\n");
|
||||
if (d) {
|
||||
// If it is an RFC... date -> first parse it...
|
||||
// otherwise try the Date() constructor.
|
||||
d = d.indexOf("T") ? xmlDate(d) : new Date(d);
|
||||
// If the date looks like it's in W3C-DTF format, convert it into
|
||||
// an IETF standard date string.
|
||||
if (d.search(/^\d\d\d\d/) != -1)
|
||||
d = this._W3CToIETFDate(d);
|
||||
|
||||
d = new Date(d);
|
||||
|
||||
// If the date could be parsed...
|
||||
if (d instanceof Date) {
|
||||
@ -112,16 +192,17 @@ var FeedView = {
|
||||
*/
|
||||
init: function() {
|
||||
// Hide the menu if the user chose to have it closed
|
||||
if (!this._getBooleanPref("showMenu"))
|
||||
if (!this._getBooleanPref("showmenu"))
|
||||
document.getElementById("menubox").style.display = "none";
|
||||
|
||||
// Normalize the date formats
|
||||
this._initializeDates();
|
||||
|
||||
// Set up the auto-reload timer
|
||||
setTimeout("RSSPrettyPrint.refresh()",
|
||||
this._getIntegerPref("reloadInterval") * 1000);
|
||||
},
|
||||
// Set up the auto-reload timer.
|
||||
// The timer loads every browser.feedview.reloadInterval minutes.
|
||||
// It is disabled if the value of that preference is 0.
|
||||
var reloadInterval = this._getIntegerPref("reloadinterval") || 0;
|
||||
if (reloadInterval > 0)
|
||||
setTimeout("FeedView.reload()", reloadInterval * 60 * 1000);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -92,10 +92,10 @@
|
||||
|
||||
<!-- The options place holder -->
|
||||
<div id="data" style="display: none;">
|
||||
<xsl:attribute name="showMenu">
|
||||
<xsl:attribute name="showmenu">
|
||||
<xsl:value-of select="$showMenu"/>
|
||||
</xsl:attribute>
|
||||
<xsl:attribute name="reloadInterval">
|
||||
<xsl:attribute name="reloadinterval">
|
||||
<xsl:value-of select="$reloadInterval"/>
|
||||
</xsl:attribute>
|
||||
<xsl:attribute name="url">
|
||||
@ -105,10 +105,10 @@
|
||||
|
||||
<xsl:apply-templates/>
|
||||
|
||||
<script type="application/x-javascript"><!--
|
||||
<script type="application/x-javascript">
|
||||
// Initialize the view
|
||||
FeedView.init();
|
||||
//--></script>
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user