Пишу простенькое расширение для FireFox, есть проблема.

При скачивании динамически выдаваемого скриптом файла с помощью saveURL(url, <по-нулям>), Download Manager в диалоге сохранения пишет в качестве имени файла имя скрипта (то-есть, нечто типа getfile.php).

Каким образом можно заставить менеджера по-умолчанию выставить заданное имя файла с заданным расширением?

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

Гм, а смотрели как это сделано в похожих расширениях, том же Flashgot например?

Unghost пишет

Гм, а смотрели как это сделано в похожих расширениях, том же Flashgot например?

Да, смотрел. Обычно такие качалки используют "путёвые" объекты, инициализируя их с заранее прописанным в .ini-файле путём. Далее они так или иначе берут имя файла и запихивают всё это в saveURL или подобный метод. Всё бы было хорошо, но хочется использовать просто последний каталог, куда сохранялись файлы менеджером. Кроме того, у меня какие-то непонятки с инициализацией. Например, initWithPath как-то не работает, ошибка выдаётся туманная и не понятно, в чем причина.
Вопрос вдогонку: а есть вообще способы сделать такой описательный RDF-файл, чтобы код не приходилось запихивать в jar-архив?

bassmandion пишет

...
Каким образом можно заставить менеджера по-умолчанию выставить заданное имя файла с заданным расширением?
...

Подменить на время сохранения функцию getDefaultFileName:

Выделить код

Код:

function mySave (addr, name)
{
	var ogdfn = getDefaultFileName;
	getDefaultFileName = function (a, b, c, d)
	{
		return validateFileName (name);
	}
	saveURL (addr, "", "", false, false, makeURI (addr));
	getDefaultFileName = ogdfn;
}

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

Насколько я смог разобраться в коде contentAreaUtils.js, второй аргумент saveURL - только строка. saveURL является "оболочкой" для internalSave, вот в неё можно (но (имхо) сложно).

...
...у меня какие-то непонятки с инициализацией. Например, initWithPath как-то не работает, ошибка выдаётся туманная и не понятно, в чем причина...

Рискну предположить, что пишите в путях обратные слэши по одному (C:\path1\path2\...\pathN). Надо по два (C:\\path...).

...есть вообще способы сделать такой описательный RDF-файл, чтобы код не приходилось запихивать в jar-архив?

Ничего особенного тут нет. Допустим, есть any_extension.jar и install.rdf:

Выделить код

Код:

<em:file>
        <Description about="urn:mozilla:extension:file:any_extension.jar">
            <em:package>content/any_extension/</em:package>
            <em:locale>locale/en-US/any_extension/</em:locale>
            <em:locale>locale/ru-RU/any_extension/</em:locale>
            <em:skin>skin/classic/</em:skin>
            <em:skin>skin/skin2/</em:skin>
            <em:skin>skin/skin3/</em:skin>
        </Description>
    </em:file>

Можно сделать каталог any_extension с содержимым any_extension.jar и изменить строку

Выделить код

Код:

<Description about="urn:mozilla:extension:file:any_extension.jar">

так:

Выделить код

Код:

<Description about="urn:mozilla:extension:file:any_extension">

jar-архив - он как бы обычный каталог для инсталлятора.

Anton
Спасибо за наводку, я покопался в том же файле и выяснил, что он работает чуть поинтереснее и как раз в моём случае в имя в конце добавляется .htm. (это видно в вункции initFileInfo) Зато уже гарантированно работает вот такой:

Выделить код

Код:

function mySave (addr, name, ext)
{
    var ifi = initFileInfo;
    initFileInfo = function(aFI, aURL, aDocument, aContentType, aContentDisposition)
    {
        aFI.uri = makeURI(addr);
        aFI.fileName = name;
        aFI.fileExt = ext;
        aFI.fileBaseName = name;
    }
    saveURL (addr, "", "", false, false, makeURI(addr));
    initFileInfo = ifi;
}

jar-архив - он как бы обычный каталог для инсталлятора.

Вот я так попробовал, у меня получилось такое дерево каталогов: chrome\ext_name\content\файлы. Однако при запуске FF собщил, что не может найти XUL-файл по этому пути. Впринципе, это не критично, но странно.

bassmandion пишет

...

jar-архив - он как бы обычный каталог для инсталлятора.

Вот я так попробовал, у меня получилось такое дерево каталогов: chrome\ext_name\content\файлы. Однако при запуске FF собщил, что не может найти XUL-файл по этому пути. Впринципе, это не критично, но странно.

Видимо, где-то ошибка, так что ничего странного. Попробую изложить ещё раз.
Допустим, есть рабочее расширение с примерно такой:

Выделить код

Код:

install.rdf         <файл>
chrome              <каталог>
    any_ext.jar     <jar-каталог>
        content     <каталог>
        skin        <каталог>
        locale      <каталог>

структурой. Чтобы избавиться от jar-файла, нужно как указывалось выше убрать '.jar' из install.rdf и чуть изменить имеющуюся структуру каталогов, вот так:

Выделить код

Код:

install.rdf         <файл>
chrome              <каталог>
    any_ext         <каталог>
        content     <каталог>
        skin        <каталог>
        locale      <каталог>

Если рядом с install.rdf имеется chrome.manifest то нужно ещё изменить и его.

Если рядом с install.rdf имеется chrome.manifest

Да, видимо тут и была ошибка, ибо я пытался править файлик прямо в каталоге с установленными расширениями.

Плз, помогите дожать дополнение File Title 1.3.
При сохранении страницы в txt подставляет расширение .htm вместо .txt

Залез внутрь filetitleOverlay.xul,

Выделить код

Код:

if (docTitle) {
      // 3) Use the document title
      return docTitle";

Заменил на

Выделить код

Код:

if (docTitle) {
      // 3) Use the document title
      return docTitle + ".txt";

установил в FF 3.0.3, сохраняет по-прежнему с расширением .htm, к имени файла добавляя .txt: filename.txt.htm

Видимо, нужно подменить еще и функцию initFileInfo?
"Сами мы не местные" (пока не очень понимаю), подскажите, как при сохранении в текстовом формате добавлять расширение .txt вместо .htm

Еще бы хотелось в первую строчку сохраняемого файла добавлять URL страницы, дату и время сохранения. (Ну еще чтоб золотая рыбка была на посылках... :|)

Если несложно, помогите. Или лучше попинайте по шагам и rtfm, чтоб до этого дошел бы я сам.

Спасибо!

Microscope
Надо братьи отлаживать - совершенно не факт, что именно 3-й пункт срабатывает.
Запускайте браузер с параметром -console - откроется второе окно с консолью, куда можно выводить сообщения с помощью

Выделить код

Код:

dump("сообщение\n");

.
Хотя в таком простом случае можно и alert-ами обойтись.

Удачи :)

Forest, спасибо за помощь, буду примерно знать, как отлаживать.
А как менять код плагина, не переустанавливая?

- совершенно не факт, что именно 3-й пункт срабатывает.

Именно 3-й, так как я видел его результат - 'File_Title.htm' я "превратил" (о я какой! - не ожидал, так как в Яве и xul с crome полный чай... начинающий) в 'File_Title.txt.htm'

А вот насчет расширения файла. Погуглив getdefaultfilename, обнаружил эту тему и текст

bassmandion пишет

в имя в конце добавляется .htm. (это видно в вункции initFileInfo)

Значит, расширением "управляет" initFileInfo.
Как ее заменить, чтобы добавлять правильное расширение, где  ее найти?

(Ну и насчет URL'а источника в первой строке сохраняемого файла.)

Microscope

А как менять код плагина, не переустанавливая?

У меня у File Title содержимое не запаковано - так что файл лежит прямо в папке с расширением - можно прямо там и править (только бакап сделать).
Возможно надо будет еще с ключиками побаловаться - можно посмотреть здесь.

brusalv
вопрос не там задаёте, но создать ссылку на страницу можно перетаскиванием иконки сайта на рабочий стол

Немного о сохранении URL в файле и буфере обмена - то, что нашел