Fixes #694, Problems with zotero://select

- Custom protocol handler extensions like zotero://select can now not return a channel and the request will be automatically cancelled without throwing an error
- Switched Timeline code to use the stringbundle methods to access timeline.properties
- Even though zotero://select now works properly, switched Timeline to access ZoteroPane directly and call selectItem() (calling toggleDisplay() first to open the Zotero pane if necessary)
- Now getting some localized strings from Zotero ("Date Added" and the short month names)
This commit is contained in:
Dan Stillman 2007-08-15 08:06:33 +00:00
parent dca8b3a572
commit 7feb7995d7
5 changed files with 81 additions and 64 deletions

View File

@ -18,18 +18,4 @@ interval.century = Century
interval.millennium = Millennium interval.millennium = Millennium
dateType.published = Date Published dateType.published = Date Published
dateType.added = Date Added dateType.modified = Date Modified
dateType.modified = Date Modified
shortName.january = Jan
shortName.february = Feb
shortName.march = Mar
shortName.april = Apr
shortName.may = May
shortName.june = Jun
shortName.july = Jul
shortName.august = Aug
shortName.september = Sep
shortName.october = Oct
shortName.november = Nov
shortName.december = Dec

View File

@ -232,9 +232,11 @@ Timeline.GregorianDateLabeller=function(locale,timeZone){this._locale=locale;thi
/* /*
Modified by Ben for Zotero Modified by Ben for Zotero
*/ */
Timeline.GregorianDateLabeller.monthNames = [localeHash["shortName.january"], localeHash["shortName.february"], localeHash["shortName.march"], localeHash["shortName.april"], localeHash["shortName.may"],
localeHash["shortName.june"], localeHash["shortName.july"], localeHash["shortName.august"], localeHash["shortName.september"], localeHash["shortName.october"], localeHash["shortName.november"], localeHash["shortName.december"]]; Timeline.GregorianDateLabeller.monthNames = Zotero.CSL.Global.getMonthStrings("short");
Timeline.GregorianDateLabeller.getMonthName=function(month,locale){return Timeline.GregorianDateLabeller.monthNames[month];}; Timeline.GregorianDateLabeller.getMonthName=function(month,locale) {
return Timeline.GregorianDateLabeller.monthNames[month];
};

View File

@ -15,6 +15,7 @@
} }
</style> </style>
<script src="chrome://zotero/content/include.js"></script>
<script src="chrome://zotero/skin/timeline/timelineControls.js" type="text/javascript"></script> <script src="chrome://zotero/skin/timeline/timelineControls.js" type="text/javascript"></script>
<script src="chrome://zotero/skin/timeline/timeline-api.js" type="text/javascript"></script> <script src="chrome://zotero/skin/timeline/timeline-api.js" type="text/javascript"></script>
<script type="text/javascript"> <script type="text/javascript">
@ -77,7 +78,15 @@
} }
Timeline.DurationEventPainter.prototype._showBubble = function(x, y, evt) { Timeline.DurationEventPainter.prototype._showBubble = function(x, y, evt) {
window.location='zotero://select/item/' + evt.getDescription(); // Get ChromeWindow so we have access to ZoteroPane (overlay.js)
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var win = wm.getMostRecentWindow('navigator:browser');
var zp = win.ZoteroPane;
if (!zp.isShowing()) {
zp.toggleDisplay();
}
zp.selectItem(evt.getDescription());
} }
document.write("<title>"+localeHash["general.title"]+"</title>"); document.write("<title>"+localeHash["general.title"]+"</title>");

View File

@ -1,27 +1,42 @@
var localeHash = getLocaleHash(); var localeBundle = initLocaleBundle();
var jumpToYearTimer; var jumpToYearTimer;
var lastJumpToYearValue; var lastJumpToYearValue;
function getLocaleHash() { /*
var localeHash = new Object(); * Set up the localization string bundle from timeline.properties
var content = getContentsFromURL("chrome://zotero/locale/timeline.properties"); */
var m; function initLocaleBundle() {
while(true) { var src = 'chrome://zotero/locale/timeline.properties';
m = /^[\S]+(?=\s*=)/gm.exec(content); var localeService = Components.classes['@mozilla.org/intl/nslocaleservice;1']
if(!m) { .getService(Components.interfaces.nsILocaleService);
break; var appLocale = localeService.getApplicationLocale();
}
localeHash[m] = /=[^\n]+/g.exec(content).toString().replace(/=\s*/,'');; var stringBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"]
} .getService(Components.interfaces.nsIStringBundleService);
return localeHash; return stringBundleService.createBundle(src, appLocale);
} }
function getContentsFromURL(url) { /*
var xmlhttp = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] * Get a localized string from the string bundle
.createInstance(); *
xmlhttp.open('GET', url, false); * This is copied from zotero.js
xmlhttp.send(null); */
return xmlhttp.responseText; function getString(name, params){
try {
if (params != undefined){
if (typeof params != 'object'){
params = [params];
}
var l10n = localeBundle.formatStringFromName(name, params, params.length);
}
else {
var l10n = localeBundle.GetStringFromName(name);
}
}
catch (e){
throw ('Localized string not available for ' + name);
}
return l10n;
} }
@ -158,17 +173,17 @@ function createOption(t, selected) {
function getFull(a) { function getFull(a) {
switch (a) { switch (a) {
case 'd': case 'd':
return localeHash["interval.day"]; return getString("interval.day");
case 'm': case 'm':
return localeHash["interval.month"]; return getString("interval.month");
case 'y': case 'y':
return localeHash["interval.year"]; return getString("interval.year");
case 'e': case 'e':
return localeHash["interval.decade"]; return getString("interval.decade");
case 'c': case 'c':
return localeHash["interval.century"]; return getString("interval.century");
case 'i': case 'i':
return localeHash["interval.millennium"]; return getString("interval.millennium");
default: default:
return false; return false;
} }
@ -236,17 +251,17 @@ function setupOtherControls(div, timeline, url) {
var tr = table.insertRow(0); var tr = table.insertRow(0);
var td = tr.insertCell(0); var td = tr.insertCell(0);
td.innerHTML = localeHash["general.jumpToYear"]; td.innerHTML = getString("general.jumpToYear");
td = tr.insertCell(tr.cells.length); td = tr.insertCell(tr.cells.length);
td.innerHTML = localeHash["general.firstBand"]; td.innerHTML = getString("general.firstBand");
td = tr.insertCell(tr.cells.length); td = tr.insertCell(tr.cells.length);
td.innerHTML = localeHash["general.secondBand"];; td.innerHTML = getString("general.secondBand");;
td = tr.insertCell(tr.cells.length); td = tr.insertCell(tr.cells.length);
td.innerHTML = localeHash["general.thirdBand"];; td.innerHTML = getString("general.thirdBand");;
td = tr.insertCell(tr.cells.length); td = tr.insertCell(tr.cells.length);
td.innerHTML = localeHash["general.dateType"];; td.innerHTML = getString("general.dateType");;
td = tr.insertCell(tr.cells.length); td = tr.insertCell(tr.cells.length);
td.innerHTML = localeHash["general.timelineHeight"];; td.innerHTML = getString("general.timelineHeight");;
tr = table.insertRow(1); tr = table.insertRow(1);
tr.style.verticalAlign = "top"; tr.style.verticalAlign = "top";
@ -259,8 +274,8 @@ function setupOtherControls(div, timeline, url) {
input.onkeypress=doKeyPress; input.onkeypress=doKeyPress;
td.appendChild(input); td.appendChild(input);
var options = new Array(localeHash["interval.day"], localeHash["interval.month"], localeHash["interval.year"], var options = new Array(getString("interval.day"), getString("interval.month"), getString("interval.year"),
localeHash["interval.decade"], localeHash["interval.century"], localeHash["interval.millennium"]); getString("interval.decade"), getString("interval.century"), getString("interval.millennium"));
var selected = ''; var selected = '';
var theSelects = new Array(); var theSelects = new Array();
@ -302,7 +317,7 @@ function setupOtherControls(div, timeline, url) {
td = tr.insertCell(tr.cells.length); td = tr.insertCell(tr.cells.length);
options = new Array(localeHash["dateType.published"], localeHash["dateType.added"], localeHash["dateType.modified"]); options = new Array(getString("dateType.published"), Zotero.getString("itemFields.dateAdded"), getString("dateType.modified"));
var values = new Array('d', 'da', 'dm'); var values = new Array('d', 'da', 'dm');
var select4 = document.createElement("select"); var select4 = document.createElement("select");
@ -316,7 +331,7 @@ function setupOtherControls(div, timeline, url) {
td = tr.insertCell(tr.cells.length); td = tr.insertCell(tr.cells.length);
var fitToScreen = document.createElement("button"); var fitToScreen = document.createElement("button");
fitToScreen.innerHTML = localeHash["general.fitToScreen"]; fitToScreen.innerHTML = getString("general.fitToScreen");
Timeline.DOM.registerEvent(fitToScreen, "click", function () { Timeline.DOM.registerEvent(fitToScreen, "click", function () {
window.location = path + createQueryString(theQueryValue, false, timeline); window.location = path + createQueryString(theQueryValue, false, timeline);
}); });
@ -338,10 +353,10 @@ function setupFilterHighlightControls(div, timeline, bandIndices, theme) {
var tr = table.insertRow(0); var tr = table.insertRow(0);
var td = tr.insertCell(0); var td = tr.insertCell(0);
td.innerHTML = localeHash["general.filter"]; td.innerHTML = getString("general.filter");
td = tr.insertCell(1); td = tr.insertCell(1);
td.innerHTML = localeHash["general.highlight"]; td.innerHTML = getString("general.highlight");
var handler = function(elmt, evt, target) { var handler = function(elmt, evt, target) {
onKeyPress(timeline, bandIndices, table); onKeyPress(timeline, bandIndices, table);
@ -374,7 +389,7 @@ function setupFilterHighlightControls(div, timeline, bandIndices, theme) {
td = tr.insertCell(tr.cells.length); td = tr.insertCell(tr.cells.length);
var button = document.createElement("button"); var button = document.createElement("button");
button.innerHTML = localeHash["general.clearAll"]; button.innerHTML = getString("general.clearAll");
Timeline.DOM.registerEvent(button, "click", function() { Timeline.DOM.registerEvent(button, "click", function() {
clearAll(timeline, bandIndices, table); clearAll(timeline, bandIndices, table);
}); });

View File

@ -510,6 +510,9 @@ ChromeExtensionHandler.prototype = {
}, },
newChannel : function(uri) { newChannel : function(uri) {
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var chromeService = Components.classes["@mozilla.org/network/protocol;1?name=chrome"] var chromeService = Components.classes["@mozilla.org/network/protocol;1?name=chrome"]
.getService(Components.interfaces.nsIProtocolHandler); .getService(Components.interfaces.nsIProtocolHandler);
@ -522,14 +525,12 @@ ChromeExtensionHandler.prototype = {
var ext = this._extensions[extSpec]; var ext = this._extensions[extSpec];
if (uriString.indexOf(extSpec) == 0) { if (uriString.indexOf(extSpec) == 0) {
if (this._systemPrincipal == null) { if (this._systemPrincipal == null) {
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var chromeURI = chromeService.newURI(DUMMY_CHROME_URL, null, null); var chromeURI = chromeService.newURI(DUMMY_CHROME_URL, null, null);
var chromeChannel = chromeService.newChannel(chromeURI); var chromeChannel = chromeService.newChannel(chromeURI);
// Cache System Principal from chrome request
// so proxied pages load with chrome privileges
this._systemPrincipal = chromeChannel.owner; this._systemPrincipal = chromeChannel.owner;
var chromeRequest = chromeChannel.QueryInterface(Components.interfaces.nsIRequest); var chromeRequest = chromeChannel.QueryInterface(Components.interfaces.nsIRequest);
@ -537,14 +538,18 @@ ChromeExtensionHandler.prototype = {
} }
var extChannel = ext.newChannel(uri); var extChannel = ext.newChannel(uri);
// Extension returned null, so cancel request
if (!extChannel) {
var chromeURI = chromeService.newURI(DUMMY_CHROME_URL, null, null);
var extChannel = chromeService.newChannel(chromeURI);
var chromeRequest = extChannel.QueryInterface(Components.interfaces.nsIRequest);
chromeRequest.cancel(0x804b0002); // BINDING_ABORTED
}
if (this._systemPrincipal != null) { if (this._systemPrincipal != null) {
// applying cached system principal to extension channel // applying cached system principal to extension channel
extChannel.owner = this._systemPrincipal; extChannel.owner = this._systemPrincipal;
} }
else {
// no cached system principal to apply to extension channel
}
extChannel.originalURI = uri; extChannel.originalURI = uri;