Необходимо определить допустимую в приложении версию JavaScript, чтобы правильно сформировать атрибут type элемента script в динамически формируемом оверлее.
Так вот, как точно узнать какой "хвост" писать в type="application/x-javascript;version=..." (и писать ли вообще) ?
Кому-нибудь попадалась подходящая метода ?

Я встречал вот такое определение (только там было с text/javascript – для всяких там IE):

Выделить код

Код:

<script type="application/x-javascript;version=1.5">var jsVers = "1.5";</script>
<script type="application/x-javascript;version=1.6">jsVers = "1.6";</script>
<!-- и т.д. -->

Выглядит не особо, ага.

Или что-то вроде этого:

Выделить код

Код:

var info = Components.classes["@mozilla.org/xre/app-info;1"]
	.getService(Components.interfaces.nsIXULAppInfo);
/*
var res = [];
for(var p in info)
	res.push("." + p + " = " + info[p]);
alert(res.join("\n"));
*/
var geckoVers = info.platformVersion;
var jsVers = "1.5";
if(/ что-то там /.test(geckoVers))
	jsVers = "1.6";
else if(/ что-то там /.test(geckoVers))
	jsVers = "1.7";
// и т.д.

Но мне все-таки кажется, что должна быть возможность напрямую версию спросить... =/

Infocatcher пишет

Я встречал вот такое определение (только там было с text/javascript – для всяких там IE):

Выделить код

Код:

<script type="application/x-javascript;version=1.5">var jsVers = "1.5";</script>
<script type="application/x-javascript;version=1.6">jsVers = "1.6";</script>
<!-- и т.д. -->

Выглядит не особо, ага.

Я вот на скорую руку проверил (FF2)

Выделить код

Код:

let a = 20;
alert (a);

в случае

Выделить код

Код:

<script type="application/x-javascript;version=1.8" src="chrome://custombuttons/content/cbbutton.js"/>
  <script type="application/x-javascript;version=1.7" src="chrome://custombuttons/content/cbbutton.js"/>
  <script type="application/x-javascript" src="chrome://custombuttons/content/cbbutton.js"/>

работает, а если

Выделить код

Код:

<script type="application/x-javascript" src="chrome://custombuttons/content/cbbutton.js"/>
  <script type="application/x-javascript;version=1.7" src="chrome://custombuttons/content/cbbutton.js"/>
  <script type="application/x-javascript;version=1.8" src="chrome://custombuttons/content/cbbutton.js"/>

уже нет. Знать бы наверняка, что первый вариант есть абсолютно правильный при необходимости поддержки нескольких версий JavaScript.
Может быть, где-то есть точная достоверная информация на эту тему ?

Но мне все-таки кажется, что должна быть возможность напрямую версию спросить... =/

Чёрт его знает. Часа четыре убил, ничего подходящего не нашёл.

Интересно, а зачем вообще это надо? Почему нельзя просто использовать наименьшую поддерживаемую версию: для веб-страниц - видимо 1.5, а для расширений можно поставить соответствующую minVersion (например, JS 1.7 и Firefox 2.0+).

Почему нельзя просто использовать наименьшую поддерживаемую версию

Расширение CustomButtons работает в FF 1.5-3.2, TB 2.0-3.0, SB 0.8-0.9, Flock. Код кнопок вызывается из скриптов расширения, поэтому, если поставить минимальную версию, в коде кнопок нельзя будет пользоваться возможностями старших версий JavaScript, даже если приложение их поддерживает. Если ставить максимальную версию, надо будет поддерживать несколько вариантов каждой версии расширения пока все Gecko-based приложения не "устаканятся" на единой версии JavaScript.

Выделить код

Код:

<script type="text/javascript">
var jsver = 1.0;
</script>

<script language="Javascript1.7">
jsver = 1.7;
</script>

<script language="Javascript1.8">
jsver = 1.8;
</script>

<script language="Javascript1.9">
jsver = 1.9;
</script>

<script type="text/javascript">
alert(jsver);
</script>
Shutnik пишет

<script language="Javascript1.7">

Все же это я спутал – я именно такой вариант встречал (вроде, в каком-то счетчике).
А вот Firefox (по идее, вместе со всеми gecko-программами) вполне себе внятно реагирует и на
<script type="application/x-javascript;version=1.7">

P.S. Накопал у себя демонстрашку: js_version.html

Это разве корректный type?

А вот, положим

Выделить код

Код:

...
<script... jsver=...>
...

и как я из компоненты доберусь до jsver ? : ) (не говоря уже о том, что версию js мне надо "сделать" до загрузки скрипта).

А вот ещё такая штука:

Выделить код

Код:

<script type="application/x-javascript">alert (jsVer1 + "/ " + jsVer2 + "/ " + jsVer3 + "/ " + jsVer4);</script>
	
	<script type="application/x-javascript">var jsVer1 = 1.5; alert ("jsVer1 = " + jsVer1);</script>
	<script type="application/x-javascript;version=1.6">var jsVer1 = 1.6; alert ("jsVer1 = " + jsVer1);</script>
	<script type="application/x-javascript;version=1.7">var jsVer1 = 1.7; alert ("jsVer1 = " + jsVer1);</script>
	<script type="application/x-javascript;version=1.8">var jsVer1 = 1.8; alert ("jsVer1 = " + jsVer1);</script>
	
	<script type="application/x-javascript;version=1.8">var jsVer2 = 1.8; alert ("jsVer2 = " + jsVer2);</script>
	<script type="application/x-javascript;version=1.7">var jsVer2 = 1.7; alert ("jsVer2 = " + jsVer2);</script>
	<script type="application/x-javascript;version=1.6">var jsVer2 = 1.6; alert ("jsVer2 = " + jsVer2);</script>
	<script type="application/x-javascript">var jsVer2 = 1.5; alert ("jsVer2 = " + jsVer2);</script>
	
	<script type="text/javascript">var jsVer3 = 1.5; alert ("jsVer3 = " + jsVer3);</script>
	<script language="Javascript1.6">var jsVer3 = 1.6; alert ("jsVer3 = " + jsVer3);</script>
	<script language="Javascript1.7">var jsVer3 = 1.7; alert ("jsVer3 = " + jsVer3);</script>
	<script language="Javascript1.8">var jsVer3 = 1.8; alert ("jsVer3 = " + jsVer3);</script>
	
	<script language="Javascript1.8">var jsVer4 = 1.8; alert ("jsVer4 = " + jsVer4);</script>
	<script language="Javascript1.7">var jsVer4 = 1.7; alert ("jsVer4 = " + jsVer4);</script>
	<script language="Javascript1.6">var jsVer4 = 1.6; alert ("jsVer4 = " + jsVer4);</script>
	<script type="text/javascript">var jsVer4 = 1.5; alert ("jsVer4 = " + jsVer4);</script>
	
	<script type="application/x-javascript">alert (jsVer1 + ": " + jsVer2 + ": " + jsVer3 + ": " + jsVer4);</script>

FF2: 3 алерта jsVer1, 3 алерта jsVer2, 3 алерта jsVer3, 0 алертов jsVer4, 0 алертов от первого и последнего скриптов.
FF3: 4 алерта jsVer1, 4 алерта jsVer2, 4 алерта jsVer4, 4 алерта jsVer4, 1 алерт от последнего скрипта

Другой вариант:

Выделить код

Код:

<script type="application/x-javascript" src="jsVer1.js"/>
	<script type="application/x-javascript;version=1.6" src="jsVer1.js"/>
	<script type="application/x-javascript;version=1.7" src="jsVer1.js"/>
	<script type="application/x-javascript;version=1.8" src="jsVer1.js"/>
	
	<script type="application/x-javascript;version=1.8" src="jsVer2.js"/>
	<script type="application/x-javascript;version=1.7" src="jsVer2.js"/>
	<script type="application/x-javascript;version=1.6" src="jsVer2.js"/>
	<script type="application/x-javascript" src="jsVer2.js"/>
	
	<script type="text/javascript" src="jsVer3.js"/>
	<script language="Javascript1.6" src="jsVer3.js"/>
	<script language="Javascript1.7" src="jsVer3.js"/>
	<script language="Javascript1.8" src="jsVer3.js"/>
	
	<script language="Javascript1.8" scr="jsVer4.js"/>
	<script language="Javascript1.7" scr="jsVer4.js"/>
	<script language="Javascript1.6" scr="jsVer4.js"/>
	<script type="text/javascript" scr="jsVer4.js"/>

(скрипт jsVer1.js содержит alert ("jsVer1"); и т. д.)
FF2: 4(!) алерта jsVer1, 4(!) алерта jsVer2, 3 алерта jsVer3, 0 алертов jsVer4
FF3: 4 алерта jsVer1, 4 алерта jsVer2, 4 алерта jsVer3, 0 алертов jsVer4

Количество алертов обрекает на необходимость держать в голове возможность сторонних эффектов от повторного исполнения скриптов.

X версионных оверлеев x Y перекрываемых xul-ов в chrome.manifest не воодушевляют (собственно, этому и ищу альтернативу).

Anton пишет

Расширение CustomButtons работает в FF 1.5-3.2, TB 2.0-3.0, SB 0.8-0.9, Flock.

Мб и не самый лучший вариант, но почему бы просто не прописать таблицу версий JS в привязке к версии проги?

Forest
Нормальный вариант, правда, лучше привязку делать по версии платформы (прог много, версии у них разные, а платформа - одна).
Где бы взять наиболее достоверную таблицу.

Где бы взять наиболее достоверную таблицу.

JavaScript versions

Crazy-EyE

JavaScript versions

Надёжный источник, но почему не достоверный ?
Почему FF1.5/FF2 - Mozilla-based, а FF3 - Gecko-based ?

Кстати, распространённый способ определения версии - проверка на наличие функции, которая есть в нужной версии ;)
А прямого получения версии действительно как-то не наблюдается :(

Из новой версии Greasemonkey, файл components\greasemonkey.js:

Выделить код

Код:

const maxJSVersion = (function getMaxJSVersion() {
  // Default to version 1.6, which FF1.5 and later support.
  var jsVersion = 160;

  var jsds = Cc["@mozilla.org/js/jsd/debugger-service;1"].getService()
               .QueryInterface(Ci.jsdIDebuggerService);
  jsds.on();
  jsds.enumerateContexts({ enumerateContext: function(context) {
    if (context.version > jsVersion) jsVersion = context.version;
  }});
  jsds.off();

  return (jsVersion / 100).toString();
})();