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
|
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
|
|
|
@ -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];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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>");
|
||||||
|
|
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user