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:
parent
dca8b3a572
commit
7feb7995d7
|
@ -18,18 +18,4 @@ interval.century = Century
|
|||
interval.millennium = Millennium
|
||||
|
||||
dateType.published = Date Published
|
||||
dateType.added = Date Added
|
||||
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
|
||||
dateType.modified = Date Modified
|
|
@ -232,9 +232,11 @@ Timeline.GregorianDateLabeller=function(locale,timeZone){this._locale=locale;thi
|
|||
/*
|
||||
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.getMonthName=function(month,locale){return Timeline.GregorianDateLabeller.monthNames[month];};
|
||||
|
||||
Timeline.GregorianDateLabeller.monthNames = Zotero.CSL.Global.getMonthStrings("short");
|
||||
Timeline.GregorianDateLabeller.getMonthName=function(month,locale) {
|
||||
return Timeline.GregorianDateLabeller.monthNames[month];
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
}
|
||||
</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/timeline-api.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
|
@ -77,7 +78,15 @@
|
|||
}
|
||||
|
||||
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>");
|
||||
|
|
|
@ -1,27 +1,42 @@
|
|||
var localeHash = getLocaleHash();
|
||||
var localeBundle = initLocaleBundle();
|
||||
var jumpToYearTimer;
|
||||
var lastJumpToYearValue;
|
||||
|
||||
function getLocaleHash() {
|
||||
var localeHash = new Object();
|
||||
var content = getContentsFromURL("chrome://zotero/locale/timeline.properties");
|
||||
var m;
|
||||
while(true) {
|
||||
m = /^[\S]+(?=\s*=)/gm.exec(content);
|
||||
if(!m) {
|
||||
break;
|
||||
}
|
||||
localeHash[m] = /=[^\n]+/g.exec(content).toString().replace(/=\s*/,'');;
|
||||
}
|
||||
return localeHash;
|
||||
/*
|
||||
* Set up the localization string bundle from timeline.properties
|
||||
*/
|
||||
function initLocaleBundle() {
|
||||
var src = 'chrome://zotero/locale/timeline.properties';
|
||||
var localeService = Components.classes['@mozilla.org/intl/nslocaleservice;1']
|
||||
.getService(Components.interfaces.nsILocaleService);
|
||||
var appLocale = localeService.getApplicationLocale();
|
||||
|
||||
var stringBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"]
|
||||
.getService(Components.interfaces.nsIStringBundleService);
|
||||
return stringBundleService.createBundle(src, appLocale);
|
||||
}
|
||||
|
||||
function getContentsFromURL(url) {
|
||||
var xmlhttp = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
|
||||
.createInstance();
|
||||
xmlhttp.open('GET', url, false);
|
||||
xmlhttp.send(null);
|
||||
return xmlhttp.responseText;
|
||||
/*
|
||||
* Get a localized string from the string bundle
|
||||
*
|
||||
* This is copied from zotero.js
|
||||
*/
|
||||
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) {
|
||||
switch (a) {
|
||||
case 'd':
|
||||
return localeHash["interval.day"];
|
||||
return getString("interval.day");
|
||||
case 'm':
|
||||
return localeHash["interval.month"];
|
||||
return getString("interval.month");
|
||||
case 'y':
|
||||
return localeHash["interval.year"];
|
||||
return getString("interval.year");
|
||||
case 'e':
|
||||
return localeHash["interval.decade"];
|
||||
return getString("interval.decade");
|
||||
case 'c':
|
||||
return localeHash["interval.century"];
|
||||
return getString("interval.century");
|
||||
case 'i':
|
||||
return localeHash["interval.millennium"];
|
||||
return getString("interval.millennium");
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
@ -236,17 +251,17 @@ function setupOtherControls(div, timeline, url) {
|
|||
var tr = table.insertRow(0);
|
||||
|
||||
var td = tr.insertCell(0);
|
||||
td.innerHTML = localeHash["general.jumpToYear"];
|
||||
td.innerHTML = getString("general.jumpToYear");
|
||||
td = tr.insertCell(tr.cells.length);
|
||||
td.innerHTML = localeHash["general.firstBand"];
|
||||
td.innerHTML = getString("general.firstBand");
|
||||
td = tr.insertCell(tr.cells.length);
|
||||
td.innerHTML = localeHash["general.secondBand"];;
|
||||
td.innerHTML = getString("general.secondBand");;
|
||||
td = tr.insertCell(tr.cells.length);
|
||||
td.innerHTML = localeHash["general.thirdBand"];;
|
||||
td.innerHTML = getString("general.thirdBand");;
|
||||
td = tr.insertCell(tr.cells.length);
|
||||
td.innerHTML = localeHash["general.dateType"];;
|
||||
td.innerHTML = getString("general.dateType");;
|
||||
td = tr.insertCell(tr.cells.length);
|
||||
td.innerHTML = localeHash["general.timelineHeight"];;
|
||||
td.innerHTML = getString("general.timelineHeight");;
|
||||
|
||||
tr = table.insertRow(1);
|
||||
tr.style.verticalAlign = "top";
|
||||
|
@ -259,8 +274,8 @@ function setupOtherControls(div, timeline, url) {
|
|||
input.onkeypress=doKeyPress;
|
||||
td.appendChild(input);
|
||||
|
||||
var options = new Array(localeHash["interval.day"], localeHash["interval.month"], localeHash["interval.year"],
|
||||
localeHash["interval.decade"], localeHash["interval.century"], localeHash["interval.millennium"]);
|
||||
var options = new Array(getString("interval.day"), getString("interval.month"), getString("interval.year"),
|
||||
getString("interval.decade"), getString("interval.century"), getString("interval.millennium"));
|
||||
var selected = '';
|
||||
var theSelects = new Array();
|
||||
|
||||
|
@ -302,7 +317,7 @@ function setupOtherControls(div, timeline, url) {
|
|||
|
||||
|
||||
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 select4 = document.createElement("select");
|
||||
|
||||
|
@ -316,7 +331,7 @@ function setupOtherControls(div, timeline, url) {
|
|||
|
||||
td = tr.insertCell(tr.cells.length);
|
||||
var fitToScreen = document.createElement("button");
|
||||
fitToScreen.innerHTML = localeHash["general.fitToScreen"];
|
||||
fitToScreen.innerHTML = getString("general.fitToScreen");
|
||||
Timeline.DOM.registerEvent(fitToScreen, "click", function () {
|
||||
window.location = path + createQueryString(theQueryValue, false, timeline);
|
||||
});
|
||||
|
@ -338,10 +353,10 @@ function setupFilterHighlightControls(div, timeline, bandIndices, theme) {
|
|||
var tr = table.insertRow(0);
|
||||
|
||||
var td = tr.insertCell(0);
|
||||
td.innerHTML = localeHash["general.filter"];
|
||||
td.innerHTML = getString("general.filter");
|
||||
|
||||
td = tr.insertCell(1);
|
||||
td.innerHTML = localeHash["general.highlight"];
|
||||
td.innerHTML = getString("general.highlight");
|
||||
|
||||
var handler = function(elmt, evt, target) {
|
||||
onKeyPress(timeline, bandIndices, table);
|
||||
|
@ -374,7 +389,7 @@ function setupFilterHighlightControls(div, timeline, bandIndices, theme) {
|
|||
|
||||
td = tr.insertCell(tr.cells.length);
|
||||
var button = document.createElement("button");
|
||||
button.innerHTML = localeHash["general.clearAll"];
|
||||
button.innerHTML = getString("general.clearAll");
|
||||
Timeline.DOM.registerEvent(button, "click", function() {
|
||||
clearAll(timeline, bandIndices, table);
|
||||
});
|
||||
|
|
|
@ -510,6 +510,9 @@ ChromeExtensionHandler.prototype = {
|
|||
},
|
||||
|
||||
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"]
|
||||
.getService(Components.interfaces.nsIProtocolHandler);
|
||||
|
||||
|
@ -522,14 +525,12 @@ ChromeExtensionHandler.prototype = {
|
|||
var ext = this._extensions[extSpec];
|
||||
|
||||
if (uriString.indexOf(extSpec) == 0) {
|
||||
|
||||
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 chromeChannel = chromeService.newChannel(chromeURI);
|
||||
|
||||
// Cache System Principal from chrome request
|
||||
// so proxied pages load with chrome privileges
|
||||
this._systemPrincipal = chromeChannel.owner;
|
||||
|
||||
var chromeRequest = chromeChannel.QueryInterface(Components.interfaces.nsIRequest);
|
||||
|
@ -537,14 +538,18 @@ ChromeExtensionHandler.prototype = {
|
|||
}
|
||||
|
||||
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) {
|
||||
// applying cached system principal to extension channel
|
||||
extChannel.owner = this._systemPrincipal;
|
||||
}
|
||||
else {
|
||||
// no cached system principal to apply to extension channel
|
||||
}
|
||||
|
||||
extChannel.originalURI = uri;
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user