Страницы: 1
Спасибо. Получилось.
Ещё помогла тема http://forum.mozilla-russia.org/viewtopic.php?id=20846.
Возможно тема не нова и уже поднималась. Но 2 дня поиска ничего не дали.
Моё расширение для FF работало во второй версии и обновлялось без проблем (<em:updateURL>). В третей версии политику изменили.
Поскольку обновления моего расширения не предвиделись, то я на обновление забил, и для совместимости с FF3 просто закомментировал тег <em:updateURL> в файле install.rdf.
Но вот потребовалось вносить изменения в расширение и вопрос поддержки обновлений стал ребром.
Если есть какое-то пошаговое руководство, что для этого нужно сделать - буду очень благодарен.
Сделал. По извращенному, но других путей не вижу.
Если брать в виде примера
var ww = openDialog("file:///P:/xul/winn.xul", "", "chrome,dialog=yes,modal=false, centerscreen"); window. setTimeout (function () {ww.tick_dialog()}, 1000); for (var i=0;i<999999999;i++) { var k=i; }
то цикл выносится в отдельную функцию. Даже не сам цикл а только его тело. Заводится глобальная переменная показывающая текущий шаг цикла. А в функции происходит рекурсивный вызов через setTimeout с инкрементом шага.
Теперь есть возможность проводить обновление диалога при каждом шаге.
Если у народа есть более удачные решения - всегда рад выслушать.
А если в Вашем примере попробовать выполнить след. код
var ww = openDialog("file:///P:/xul/winn.xul", "", "chrome,dialog=yes,modal=false, centerscreen"); window. setTimeout (function () {ww.tick_dialog()}, 1000); for (var i=0;i<999999999;i++) { var k=i; }
То отображение диалога произойдёт только после выполнения цикла. В этом вся и засада.
А value я меняю у элемента label так:
function animateDotter() { var t=document.getElementById('qsWaiterTitle'); var s=getString("waitlabel"); l_curDotCount+=1; var ti=l_curDotCount%(l_maxDotCount+1); t.setAttribute('value',s+ti); }
Немного разобрался. open() действительно лишний.
Проблема в том, что создаю я диалог в некой функции. Причём сразу после создания диалога в этой же функции идёт тяжеловесный код (вызов XPCOM), который пока не исполняется - диалог не прорисовывается.
Проблема в следующем коде:
var ww = openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
ww.open();
.....
for()
{
........
ww.foo();
......
}
....
ww.close();
Функция foo определена в диалоге и занимается его перерисовкой (меняет value у элементов диалога).
Так вот перерисовка элементов на диалоге не происходит. (Наверное точнее сказать, что функция вызывается, значения элементов меняются, но окно не перерисовывается.) Если например в foo() после присвоения новых значений вставить alert, то новые значения будут видны. Иначе нет.
Есть ли какой нибудь способ принудительно перерисовывать диалог? Уделить ему машинного времени.....
Или обеспечить в диалоге принудительн
…А почему ? Так задумано, что ли ? Т. е., он в *.xul так настроен ?
Вовсе нет. Вот заголовок xul:
<!--window-->
<window id="qsWaiterWindow"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
onload="alert(1);">
Если вместо
var ww = openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
делать
openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
то диалог открывается. Но как же к нему тогда доступиться?
Если убрать open(), то не появляется мой диалог.
Задача:
Есть расширение под FF. Нужно при некоторых действиях открывать диалог и программно управлять им. Например, когда выполняются длительные действия - менять прогресс-бар. А потом программно-же и закрыть.
Пытаюсь делать так:
var ww = openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
ww.open();
.....
ww.foo();
....
ww.close();
Однако при этом открывается ещё одно окно браузера. Это напрягает.
Какие есть нормальные решения задачи?
Куча ругательств на css. Кроме того:
1. Ошибка: Ошибка при анализе значения свойства 'cursor'. Потерянное объявление.
Источник: http://127.0.0.1:8080/apex/f?p=4500:2250:3907735138520519:GETOBJECT_TREE:NO:::
Строка: 0
2. onTabLoad: notab TD
3. Ошибка: неправильный
Источник: file:///C:/Documents%20and%20Settings/serg/Application%20Data/Mozilla/Firefox/Profiles/default.gx7/localstore.rdf
Строка 1, символ 1
На других компах пробовал - тоже самое.
В Mozilla нет никаких сообщений в консоли. Всё чисто.
Начал юзать Oracle Database 10g Express Edition.
Заметил, что при использовании FF 1.5.0.3 на странице (являющейся web-мордой администрирования Oracle) при попытке просмотра не отображаются исходники (закладка Code) хранимых процедур, функций, представлений. Также не работают кнопки на этих страницах (например, Compile,Download,Drop,Edit,Undo,Redo,Find). Похоже существует проблема в том как FF работает с Java.
В IE 6 и Mozilla 1.7.8 таких проблем не наблюдается.
Никто с такой засадой не сталкивался?
Попытка вызвать такую функцию из FF ни к чему не приводит.
function CrEmail() { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); alert(1); var pref = Components.classes["@mozilla.org/messengercompose/attachment;1"].createInstance(); alert(2); }
Alert(2) уже не срабатывает. Никаких сообщений об ошибках. Это касается всех классов, связанных с почтой.
Возможна ли ситуация, что эти классы можно использовать только из почтового клиента? А из браузера нет?
За ссылки спасибо.
Думаю, Вы хотели написать про компоненты в Mozilla Suite... в FF же нет почтового клиента.
Именно из FF. Просто нужно вызвать почтовый клиент по умолчанию. mailto не подойдёт поскольку невозможно автоматом приаттачить файл.
Нужно на странице, при некоторых условиях вызывать почтовик со сформированным письмом, в котором будут аттачи. Есть ли в FF какие-либо компоненты, которые позволят это сделать?
ps. Кроме того несказанно буду рад ссылке на справочник по существующим компонентам в @mozilla.org/ и их методам. А то как в слепую.....
Скрипт из моего расширения для FF выполняется довольно долго. И появляется известное сообщение, что скрипт "возможно занять и не отвечает". Для себя в about:config поменял dom.max_script_run_time.
Как бы его менять из скрипта перед выполнением? А потом бы неплохо вернуть старое значение...
Пока делаю через ж.... Подробнее:
файл html:
....
<script>
function foo()
{
alert("aaa");
}
<input type="Hidden" id="foo_id" onChange="foo();">
.....
в расширении пишу такую функцию:
function func1()
{
.....
alert(window.getBrowser().contentDocument.getElementById("foo_id").getAttribute('onChange'));
eval(window.getBrowser().contentDocument.getElementById("foo_id").getAttribute('onChange'));
}
То есть через скрытый элемент на странице пытаюсь вызвать некий скрипт. (Как напрямую обратиться к функции foo я не нашёл.:() Alert возвращает имя функции: "foo()". Однако eval не срабатывает. Если для элемента на странице в onChange сразу указать alert("aaa"); , то вызов происходит.
Как можно обеспечить вызов функции по имени из расширения? Подмогите советом.
ЗЫ. Предложения по улучшению кода будут приняты с благодарностью.
…Пишу свое расширение для FireFox. Нужно в этом расширении проверять на текущей странице наличие определенной функции написанной на JS. Если такая функция есть то вызвать ее.
Как можно провернуть такое?
Нашел.
user_pref("signed.applets.codebase_principal_support", true);
Выгрузку в Excel сделал. Из локального файла всё работает замечательно. Если кому нужно поделюсь.
В виде компоненты ещё не оформлял. Хочу потестировать код и осмыслить будущую структуру компоненты.
Поэтому сейчас использую комманду
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
Столкнулся с такой проблемой: при попытке выполнить код с сервера такое сообщение:
Сценарию с http://localhost было отказано в правах: UniversalXPConnect.
Наверное в мозилле нужно какие-то настройки сделать....
Использую FireFox 1.5.0.1 из под WinXP.
Помогите.
Добавлено:
С вызовом из crome та-же история. Написал специально xul-файлик (типа посредник), в котором при открытии пытаюсь выполнить код:
function ToExcel()
{
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
const cid = "@mydomain.com/XPCOMExcel/USUExcel;1";
obj = Components.classes[cid].createInstance();
obj = obj.QueryInterface(Components.interfaces.IUSUExcel);
obj.OpenExcel();
http://www.mozilla.org/projects/plugins … sWin32.zip
Второй раз выручаешь. :;) ... и это только за сегодня....
Ещё одна глупая просьба.
Не могу воспользоваться утилитой xpidl.exe для создания xpt-файла. Похоже, что проблема в том, что у меня нет файлов libIDL-0.6.dll и glib-1.2.dll и неоткуда их взять.
Может кто кинет ссылку. Или почтой... на sutni@mail.ru
В принципе можно передавать длинную строку, в которую включать разделители. А С++ уже формировать массив. Но это как-то не по-человечески :)). Да и опасно.
С передачей всего содержимого страницы видится ещё больше сложностей.
Сформировать 2-х мерный массив на JS легко. Вот как описать массив в интерфейсе не понятно.
Можно тогда ещё один вопросик?
Как в метод интерфейса передать массив? А точнее двумерный массив. Например строк.
interface IUSUExcel : nsISupports
{
long PutTable(in string titleTable, in "НУЖЕН 2-мерный массив строк" bodyTable );
};
Ожидаются ли тут проблемы на этапе передачи данных от JS к xpcom?
Нигде не могу найти примера....
Я не знакома GeckoActiveXObject, так что как разобраться с ошибкой не подскажу. Но могу предложить просто пойти другим путем. http://www.iosart.com/firefox/xpcom/ - сделайте свою компоненту... тут очень хороший пример. Если Вы просто при нажатии на кнопку тулбара(или каком-то другом событии) создадите элемент своей компоненты и передатите в нее все необходимые данные, то там с помощью COM спокойно запустите Excel.
Большое человеческое спасибо!
Поскольку никто не отвечает, расскажу куда мне удалось продвинутся. Может после этого дадут навигацию... :))
Во-первых, изменил CLSID на 00020812-0000-0000-C000-000000000046 - соответствующий Excel2003 (он у меня и установлен).
Во-вторых, установил http://www.iol.ie/~locka/mozilla/plugin.htm#download. Но это как я понял можно было и не делать.
Код теперь выглядит так:
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
if (window.GeckoActiveXObject){
var oXL=new GeckoActiveXObject("{00020812-0000-0000-C000-000000000046}");
alert (oXL);
}
if(oXL){
oXL.Visible = true;
var oWB = oXL.Workbooks.Add();
var oS = oWB.ActiveSheet;
}
Alert возвращает "xpconnect wrapped IDispatch".
В памяти повисает Excel. Но его не видно. Ошибка происходит в строке oXL.Visible = true :
Ошибка: uncaught exception: [Exception... "Cannot modify properties of a WrappedNative" nsresult: "0x80570034 (NS_ERROR_XPC_CANT_MODIFY_PROP_ON_WN)" location: "JS frame :: ..........
То
Есть желание вызывать MS Excel из FireFox для представленея неких данных в таблицах екселя.
Написал простенькое расширение, которое пытается вызвать такой код:
if (window.GeckoActiveXObject){
var oXL=new GeckoActiveXObject("Excel.Application");
}
или так:
var oXL=new GeckoActiveXObject("{00024500-0000-0000-C000-000000000046}");
появляется такая ошибка:
Ошибка: uncaught exception: [Exception... "Unable to create an instance of the desired COM classCOM Error Result = 80004002" nsresult: "0x80570039 (NS_ERROR_XPC_COM_CREATE_FAILED)" location: "JS frame :: chrome://quasy/content/quasyOverlay.js :: go2Excel :: line 21" data: no]
Line 21 - это как раз var oXL=new ...
Как можно побороть? Заранее спасибо.
Страницы: 1