LINUX.ORG.RU

Дополнения к Firefox. Работа с файловой системой и скриптами.

 , ,


0

1

Самописный плагин, который сохраняет в /tmp исходник страницы в виде файла wsourse.html, после этого запускается внешний bash-скрипт, который просто копирует файл в /домашнюю директорию/wsource.text
Вот исходник плагина

var buttons = require('sdk/ui/button/action');
var tabs = require("sdk/tabs");
var tab_utils = require("sdk/tabs/utils");
var { viewFor } = require("sdk/view/core");
const {Cc,Ci,Cu, components} = require("chrome");
Cu.import("resource://gre/modules/FileUtils.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm")
Cu.import("resource://gre/modules/Downloads.jsm");
Cu.import("resource://gre/modules/osfile.jsm")
Cu.import("resource://gre/modules/Task.jsm");
var domSerializer = Cc["@mozilla.org/xmlextras/xmlserializer;1"]
                    .createInstance(Ci.nsIDOMSerializer);
	
/*var showHotKey = Hotkey({
  combo: "control-m",
  onPress: function() */
  
var button = buttons.ActionButton({
  id: "CopySource",
  label: "test copy source",
  icon: {
    "16": "./small.png",
    "32": "./medium.png",
    "64": "./big.png"
  },
  onClick: handleClick
});

function handleClick(state){
 
    var tab = tabs.activeTab;
    var lowLevelTab = viewFor(tab);

	var browser = tab_utils.getBrowserForTab(lowLevelTab);
	var ser = new XMLSerializer();
	var st = ser.serializeToString(browser.contentDocument);

	//сохраняю полученный html код страницы
	var file = FileUtils.getFile("TmpD", ["html.tmp"]);
	file.createUnique(components.interfaces.nsIFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE);

	var ostream = FileUtils.openSafeFileOutputStream(file);

	var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
					createInstance(components.interfaces.nsIScriptableUnicodeConverter);
	converter.charset = "UTF-8";
	var istream = converter.convertToInputStream(st);

	NetUtil.asyncCopy(istream, ostream, function(status) {
	if (!components.isSuccessCode(status)) {
		return;
	}
	});
	//запускаю скрипт как аргумент bash
	var path = "/bin/bash"
	var args = ["/bin/copyscript.bash"];
	console.log(args);
	var file1 = Cc["@mozilla.org/file/local;1"]
				.createInstance(Ci.nsIFile);
	file1.initWithPath(path);

	var process = Cc["@mozilla.org/process/util;1"]
                .createInstance(Ci.nsIProcess);

	process.init(file1);
	process.run(true, args, args.length);
  }
содержимое copyscript.bash
#!/bin/bash
sleep 5
cp /tmp/wsourse.html ~/wsource.text
exit 0
Проблема в том, что при запуске плагина сурс страницы успешно сохраняется в /tmp/wsourse.html, но после исполнения скрипта в домашней директории лежит пустой ~/wsource.text, т.е. копирование не происходит. Запускал огнелиса от рута, не помогло. Запуск скрипта вручную ошибок не выдаёт.
Плюс ко всему, если нажать второй раз, то всё работает как надо, т.е. wsourse.html копируется в wsource.text
Поидее скрипт не должен запускаться пока не закончиться сохранение файла в tmp, но на всякий случай ставлю sleep 5, не помогает.
ЧЯДНТ?

Меня смущает async в NetUtil.asyncCopy. Возможно (JavaScript, хм, скорее, вероятно), там очень убогий асинк которые выполняется когда-то совсем потом. Можно попробовать дёргать скрипт из обработчика завершения асинка, это как бы правильнее в любом случае.

xaizek ★★★★★ ()

Выше уже правильно отметили, а вот рабочий кусок:

    NetUtil.asyncCopy(istream, ostream, function(status) {
        if (components.isSuccessCode(status)) {
            //запускаю скрипт как аргумент bash
            var path = "/bin/bash"
            var args = ["/home/alex/Scripts/cp.sh"];
            console.log(args);
            var file1 = Cc["@mozilla.org/file/local;1"]
                        .createInstance(Ci.nsIFile);
            file1.initWithPath(path);

            var process = Cc["@mozilla.org/process/util;1"]
                        .createInstance(Ci.nsIProcess);

            process.init(file1);
            process.run(true, args, args.length);
        }
    });
d2 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.