Остро интересует проблема открытия ссылок и страниц с русскоязычными адресами и названиями файлов/страниц в Interner Explorere со страницы в FireFox. Причем как сетевых, так и внутренних (абсолютных и относительных), внутренние даже важнее.
Нашел несколько кнопок, но ни одна не заработала с русскоязычными ресурсами в IE (в Опере все ОК).
Примеры.
Кнопка открывает текущую страницу в IE

Выделить код

Код:

function openIElink() {
      var environment = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
      var localFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
      var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
      var url = content.location.href;
      
       localFile.initWithPath(environment.get("PROGRAMFILES")+ "\\Internet Explorer\\iexplore.exe");
       process.init(localFile);
       process.run(false, [url], 1);
  }
  openIElink();

C:\test.html - открытвает нормально
C:\тест.html - Не удается найти "file:///C:/%D1%82%D0%B5%D1%81%D1%82.html"
Причем файл %D1%82%D0%B5%D1%81%D1%82.html я создал на диске C
Добавил такую строку:       
      var url = Services.io.newURI(url, null, null).asciiSpec;
Итог
C:\test.html - открытвает нормально
C:\тест.html - Не удается найти "file:///C:/%D1%82%D0%B5%D1%81%D1%82.html"
Заменил ее на
      var url = decodeURIComponent(url);
C:\test.html - открытвает нормально
C:\тест.html - Не удается найти "file:///C:/B5AB.html"
Причем файл B5AB.html созданный на диске С таким способом открывается (но он то мне не нужен ...)



Аналогично кнопка от bunda1 https://forum.mozilla-russia.org/viewtopic.php?pid=725309#p725309
Насколько я понял за захват и обработку ссылки отвечает блок

Выделить код

Код:

function openWith(path, arg) { 
      try { var url = gContextMenu.getLinkURL() } 
      catch(e) {  
         var loc = content.document.location;
         var url = (loc.host.slice(-3) == '.рф') ? Services.io.newURI(loc.href, null, null).asciiSpec : loc; 
      };

http://www.кто.рф открывает как http://www.:B>.@d/
ссылку типа href="тест.html" открывает как и предыдущая кнопка - Не удается найти "file:///C:/%D1%82%D0%B5%D1%81%D1%82.html"
с латиницей все нормально.

Что же делать?!

ruslaw пишет

Заменил ее на
      var url = decodeURIComponent(url);
C:\test.html - открытвает нормально
C:\тест.html - Не удается найти "file:///C:/B5AB.html"

nsIProcess.runw() пробовал?

ruslaw пишет

Заменил ее на
      var url = decodeURIComponent(url);

Знач, шота не то или не туда заменил ;-)
так открывает:

скрытый текст

Выделить код

Код:

function openIElink() {
      var environment = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
      var localFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
      var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);

    var arg = decodeURIComponent(content.location);

    localFile.initWithPath(environment.get("PROGRAMFILES")+ "\\Internet Explorer\\iexplore.exe");

      process.init(localFile);
      process.runw(false, [arg], 1);
    }

mokujin,
сейчас браузер вообще не реагирует на кнопку. Ни FF, ни Pale Moon, там я тоже пробую.

Ну смотри свои плугины, значит. мож кто перехватывает УРЛ строку.  У мя открывает в IE из  PM файл с таким именем:
c:\0l0\backup\PaleMoon\Распаковать файл поисковиков для FF (для PM  пока не надо). 7-13-17  205346.htm
... да, с любым именем открывает. См. у себя плуги-скрипты.
ps. ты вызов добавил : openIElink(); ?   У мя эта ф-ция в кнопке-меню живет и вызываеццо отдельно.

29-12-2017 11:41:54
т.е. фишка в том, что  Dumby подсказал : юникодную функцию надо юзать для запуска runw  + обратно из punycode декодировать адресс - decodeURIComponent();

CODE

Выделить код

Код:

/* CODE */
function openIElink() {
      var environment = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
      var localFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
      var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);

    var arg = decodeURIComponent(content.location);

    localFile.initWithPath(environment.get("PROGRAMFILES")+ "\\Internet Explorer\\iexplore.exe");

      process.init(localFile);
      process.runw(false, [arg], 1);
    }
    
    openIElink();

Да, проблема разрешена. Я просто не заметил последней строки -  openIElink();
Но у меня еще вопрос.
У Вас была кнопка - https://forum.mozilla-russia.org/viewtopic.php?pid=732256#p732256
Я там сделал указанную замену, и она тоже работает как надо.
Но можно ли сделать так чтобы для вызова function openIElink() можно было просто нажимать ссылку, а не идти через КМ?
Чрезвычайно бы облегчило мою ситуацию.
С Наступающим НГ-2018 Вас.

ruslaw пишет

Но можно ли сделать так чтобы для вызова function openIElink() можно было просто нажимать ссылку, а не идти через КМ?

ЯННП :D    КМ - ?  (ПКМ??) - хочешь чтоб сразу все ссылки открывались в IE - а как ты будешь в Mozilla "бравзерить"...

можно добавить в ту кнопку, действие для клика на самом меню, типа так:

Выделить код

Код:

// после создания меню, после строчки
    menu.hidden = true;
    
// добаь это. будет открывать в IE ссылку на кот. кликнул.     
    menu.addEventListener("mouseup", function(ef) {
    // действие по нажатию на сам пункт меню
          switch(ef.button) {
             case 0:
                openIElink();
                contextMenu.hidePopup();
                break;
            }
        });

Спасибо, так гораздо ближе к моим целям.
Но я имел в виду что-то типа такой ссылки (чистая отсебятина) <a href="CustomButtonID=myButton; openIElink('C:\Мой Файл.html')"> которая при нажатии, безо всяких меню непосредственно вызывала бы этот файл в IE.
На самом же деле для меня Internet Explorer это лишь способ заставить исполняться bat-файл, вызываемый через javascript и было бы совсем чудесно, если бы можно было создать такую кнопку которая просто захватывала ссылку на bat-файл и заставляла его исполняться, особенно здорово если бы она действовала как я уже сказал выше - через ссылку, без необходимости обращаться к меню ....

:/ тебе нужно выполнить батнег из кнопки, чтоле?  запустить батнег из бравзера и передать ему адресс ссылки, так? Это не сложно и можно.
передать ссылку в батнег - тут сложности есть. надо оборачивать в кавычки адресс(изза "амперсандов" и проч. спец.символов), передавать, а в батнеге брать его в переменную и обрезать set url="%url:~2,-2%"
нипанятна: что хочешь сделать.

Я там не совсемп понял что означает "скрипты которые следует помещать в вкладку Справка" и куда вставлять код приведенный под заголовком "Вкладка Код:". Увы я не очень в теме.
Суть моих поисков в том чтобы можно было открывать различные ссылки на внутренние файлы из FF, но так чтобы это происходило не в форме их закачивания в виде клона (как DOC или DJVU) или открытия во внутреннем просмотровщике (как с PDF), а как открытие исходного файла в дефолтной программе.
По-моему единственным способом получить такое поведение можно научив FF открывать батники, открывающие в свою очередь требуемый файл. И ссылки оформлять как ссылки на батники.

Вот я нашел кнопку

Выделить код

Код:

startProcess("C:\\start.bat",[""]);

function startProcess(path, args) {
    var file = Components.classes["@mozilla.org/file/local;1"]
        .createInstance(Components.interfaces.nsILocalFile);
     file.initWithPath(path);
    if(file.exists()) {
       var process = Components.classes["@mozilla.org/process/util;1"]
              .createInstance(Components.interfaces.nsIProcess);
       process.init(file);
        process.run(false, args, args.length);
      } else custombuttons. alertBox ("Файл не найден", path); 
};

Но она открывает один конкретный файл, что конечно не интресно.
А нельзя ли сделать что-то подобное кнопкам с открыванием ссылок в IE только вместо "C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE" указать путь "C:\\windows\\system32\\cmd.exe"
Столь простая замена у меня не получилась, но может быть это можно как-то скорректировать

*с интересом наблюдая как обновленцы пытаются поменять дворники через выхлопную трубу*
так и быть подкажу куда копать
process.run если ему указать любой файл открывает его в программе по-умолчанию т.е. если файл .txt то он откроется в блокноте если exe то запустится

получаем outerHTML ссылки и делаем реплейс href= на torun= и заменяем его изменённым

получаем атрибут torun правим его добавляя полный стандартный путь чтоб было c:\\ололо\\блабла.txt
добавляем к ссылке листенер на клик который получает атрибут torun и запускает с ним process.run

ессно все предыдущие действия пихаем в листенер на загрузку страницы чтоб ссылки колбасило автоматом.

okkamas_knife пишет

получаем outerHTML ..... делаем реплейс href= на torun= и заменяем .....

получаем атрибут .... правим ... добавляя ... чтоб было c:\\ололо\\блабла.txt
добавляем .... листенер ... ... получает атрибут torun и запускает с ним process.run

... все .... пихаем в листенер на загрузку .... колбасило автоматом.

:D  О, как всё просто , оказалось-то !

ruslaw
слушай, может тебе не мучаться, а поставить расширение , если уж очень хочеццо пользовать свой FF как обрезанный(очень сильно , прям по самые помидоры) TotalCommander ?
Расширение называется Fire Commander Там двухпанельный бравзер локальных файлов и все открывается как нарисовано в  ОС.
ибо то, что набросал okkamas_knife я никак не смогу повторить, я даже что такое  outerHTML  хз :D 

ruslaw пишет

Я там не совсемп понял что означает "скрипты которые следует помещать в вкладку Справка" и куда вставлять код приведенный под заголовком "Вкладка Код:". Увы я не очень в теме.

Понимать надо прямо, вот как написано: Код - это вкладка КОД, а Справка - вкладка Справка (куда ложить текст батнег-а)

Вот пример:

скрытый текст
Код

Выделить код

Код:

/* CODE */
// Запуск CMD, BAT, VBScript из вкладки Справка
// запускаемый батнег пишется в профиль
// в случае VBSCRIPT наверное надо поменять выходную кодировку с 866 на 1251 хз.
   var file = Services.dirsvc.get('ProfD', Ci.nsIFile);
       file.append("myBatneg.cmd");
           custombuttonsUtils.writeFile( file.path, convertFromUnicode("866", self.Help) );
       file.launch();

Справка

Выделить код

Код:

/*HELP*/
@echo off
@chcp 866
@rem ==============================================================================
echo .
echo Привет, я батнег из CustomButtons! 
echo .
pause
exit
exit

mokujin пишет: я даже что такое  outerHTML  хз

*с видом маньяка-эксгибициониста распахнул плащ*
var hrefs=window.content.document.getElementsByTagName('a');
alert(hrefs[0].outerHTML)
alert(hrefs[0].innerHTML)

ессно на странице должны быть ссылки это покажет первую

mokujin, спасибо, расширение классное, как раз для меня, я действительно поклонник такой идеологии (TC-браузер) хотя в моем данном случае оно конечно не решает проблему.

*с видом маньяка-эксгибициониста распахнул плащ*

к сожалению перед маньяком не "блондинка", а ребенок  :D
Хотя я оценил полет мысли, но мне пришлось бы копать материал пару недель как минимум.
А нельзя ли набросать пример кнопки и ссылки чтобы их можно было использовать как шаблон?
Ну очень надо!