В идеале вы не помещаете логику поведения пользовательского интерфейса в плагин, а в расширение. Плагин должен сообщить расширению, где находится файл XML, а расширение должно обрабатывать все остальное.
Это можно сделать двумя способами:
Синхронно вернуть местоположение легко: вы выполняете работу непосредственно из реализации Invoke()
вашего плагина и возвращаете строку, содержащую местоположение файла, в сценарий.
Это, конечно, имеет обратную сторону - блокировать основной поток (и GUI-) до тех пор, пока обработка не будет завершена, и, таким образом, не является опцией, если обработка не выполняется быстро.
Асинхронно его возврат - это немного больше работы: в идеале вы разрешаете расширению указывать функцию обратного вызова, которая должна вызываться после завершения обработки. Это может быть достигнуто либо соответствующей обработкой addEventListener()
, либо разрешением сценарию передавать обратный вызов в качестве параметра, когда он инициирует обработку XML. Затем функция обработки XML запускает или передает другой поток, выполняющий фактическую работу, и немедленно возвращается. Когда обработка завершена, вы вызываете NPN_InvokeDefault()
для объекта сохраненной функции, чтобы вызвать его.
Осторожно: Вызов в JavaScript всегда должен выполняться в главном потоке.