Дополнение Mozilla Выполнение кода при первом запуске

В настоящее время я создаю надстройку и хочу выполнить определенный код при первом запуске. Более конкретно, я хочу нажать на кнопку "Добавить", просмотреть мои файлы и выбрать исполняемый файл. Этот процесс просмотра должен выполняться только при первом запуске, так как я хочу, чтобы моя кнопка "запомнила", чтобы открыть этот файл после первого запуска.

jetpack.future.import("me");

var buttons = require('sdk/ui/button/action');

var button = buttons.ActionButton({
  id: "execute-jar",
  label: "Download Report",
  icon: {
    "16": "./icon-16.png",
    "32": "./icon-32.png",
    "64": "./icon-64.png"
  },
  onClick: handleClick
});

jetpack.me.onFirstRun(function(){    jetpack.notifications.show("Oh boy, I'm installed!");});

function handleClick(state) {   

    let {Cc, Ci} = require('chrome');
    var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
    file.initWithPath("C:\\Users\\QaziWa\\DownloadReportPPE.jar");

    if(file.exists()){
        file.reveal();
        file.launch();
    }
    else {
        console.log('Failed.');
    }
}

Я нашел это на MDN: https://developer.mozilla.org/en-US/docs/Archive/Mozilla/Jetpack/Meta/Me

Тем не менее, это то, что было заархивировано, и когда я попробовал это, мой код не удалось и получил: "Сообщение: ReferenceError: jetpack не определен".

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

РЕДАКТИРОВАТЬ: Для ясности: я не хочу жестко закодировать путь. Я намерен добавить функциональность, которая позволит пользователям выбирать файл, который они хотят выполнить. Мой главный вопрос: как выполнить определенный блок кода только при первом запуске?

1 ответ

Решение

Общий случай наличия кода первого запуска заключается в том, что вы используете какой-то флаг, который хранится в предпочтении, чтобы указать, запускали ли вы код или нет. Предпочтения - это то, что используется в Firefox для хранения простых данных при перезапуске приложения. Флаг может быть любого из нескольких типов (строка, число, логическое значение и т. Д.). Вам просто нужно иметь значение, которое вы можете проверить, чтобы увидеть, запустили ли вы свой первый запуск кода. Общий случай этого обсуждается для MDN в Приложении B: Установка и удаление сценариев, но эта страница не зависит от SDK. Когда ваш код надстройки запускается, вы проверяете, показывает ли флаг, что вы уже выполнили свой первый запуск кода. Если флаг указывает, что вы не запускали код первого запуска, вы запускаете этот код и устанавливаете флаг, чтобы указать, что он был запущен. Вы можете немного изменить это, чтобы иметь код, который запускается только при обновлении до новой версии (просто другой флаг) и т. Д.

В этом случае нам также нужно сохранить выбранное пользователем имя файла / путь через перезапуски Firefox. Учитывая, что нам уже нужно хранить эту информацию, и это то, что нам нужно, чтобы получить код первого запуска, действительность chosenFilename также может использоваться как флаг для запуска кода первого запуска. Таким образом, вы сохраняете полное имя файла / путь к файлу, выбранному в качестве предпочтения. Если это предпочтение не содержит имени файла, вы запускаете логику выбора / просматриваете файл (ваш код первого запуска).

В этом случае мы также запускаем код для поиска файла, если обнаруживается, что сохраненный файл не существует, когда мы пытаемся открыть его (например, пользователь удалил / переместил файл). Очевидно, у вас также должен быть способ для пользователя вручную запустить средство выбора файлов. К счастью, система simple-prefs позаботится об этом, когда мы объявим type какfile, Кнопка " Обзор" будет отображаться в диалоговом окне параметров, которое пользователь может использовать, чтобы вручную выбрать другой файл.

Что-то вроде:

let {Cc, Ci} = require('chrome');
let preferences = require("sdk/simple-prefs").prefs;
let winUtils = require("sdk/window/utils");
const nsIFilePicker = Ci.nsIFilePicker;

function chooseFilename(){
    //If you only want .jar files then you would specify that in the filter(s):
    preferences.chosenFilename = browseForFilePath(nsIFilePicker.filterAll);
    //Just assume that it is valid. Should verify here that filename is valid.
}

function openChosenFilename() {   
    let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
    file.initWithPath(preferences.chosenFilename);
    while(!file.exists()){
        //The file we had is no longer valid. We need a valid filename so try choosing it
        // again. Keep doing so until it actually exists.
        chooseFilename();
        file.initWithPath(preferences.chosenFilename);
    }
    return file;
}

//The following function was copied from promptForFile(), then modified: 
//https://developer.mozilla.org/en-US/Add-ons/SDK/Tutorials/Creating_reusable_modules
function browseForFilePath(fileFilters) {
    let filePicker = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
    let recentWindow = winUtils.getMostRecentBrowserWindow();
    filePicker.init(recentWindow, "Select a file", nsIFilePicker.modeOpen);
    filePicker.appendFilters(fileFilters);
    let path = "";
    let status = filePicker.show();
    if (status === nsIFilePicker.returnOK || status === nsIFilePicker.returnReplace) {
        // Get the path as string.
        path = filePicker.file.path;
    }
    return path; //"" if invalid
}

if(preferences.chosenFilename.length<5) {
    //This is our first run code. We only run it if the length of the chosenFilename 
    //  is less than 5 (which is assumed to be invalid).
    //  You can have any first run code here. You just need to have the 
    //  preference you test for (which could be a string, boolean value, number, whatever) 
    //  be set prior to exiting this if statement. In this specific case,
    //  it is a filename. Given that we also want to store the filename persistent
    //  across Firefox restarts we are checking for filename being stored as a preference
    //  instead of an additional flag that says we have already run this code.
    chooseFilename();
}

let file = openChosenFilename();
file.reveal();
file.launch();

Ваш package.json также нуждается в:

"preferences": [{
    "name": "chosenFilename",
    "title": "Filename that has been chosen",
    "description": "A file the user has chosen",
    "type": "file",
    "value": ""
},
Другие вопросы по тегам