Задача:
Есть расширение под FF. Нужно при некоторых действиях открывать диалог и программно управлять им. Например, когда выполняются длительные действия - менять прогресс-бар. А потом программно-же и закрыть.
Пытаюсь делать так:
var ww = openDialog("chrome://..../wait.xul", "", "chrome,dialog=yes,titlebar=no,popup=yes,modal=false, centerscreen");
ww.open();
.....
ww.foo();
....
ww.close();
Однако при этом открывается ещё одно окно браузера. Это напрягает.

Какие есть нормальные решения задачи?

sutni пишет

...
Однако при этом открывается ещё одно окно браузера....

А если убрать ww.open() ?

Если убрать open(), то не появляется мой диалог.

sutni пишет

Если убрать open(), то не появляется мой диалог.

А почему ? Так задумано, что ли ? Т. е., он в *.xul так настроен ?

Диалог открывается по openDialog, а новое окно браузера - по open.

А почему ? Так задумано, что ли ? Т. е., он в *.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");
то диалог открывается.  Но как же к нему тогда доступиться?

а если так попробовать !

Выделить код

Код:

aaa.js
function WinisRun(win)
{
 // win - указатель на окно
}
bbb.xul
<script type="application/x-javascript" src="chrome://.../content/aaa.js"/>
<window id="qsWaiterWindow"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
           onload="WinisRun(this)">
sutni пишет

...
Если вместо
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");
то диалог открывается...

Ну... не знаю. У меня оба варианта работают.

Вроде можно ещё так

Выделить код

Код:

var dialog = document.getElementById('qsWaiterWindow');
dialog.foo();

Немного разобрался. 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, то новые значения будут видны. Иначе нет.
Есть ли какой нибудь способ принудительно перерисовывать диалог? Уделить ему машинного времени.....

Или обеспечить в диалоге принудительную перерисовку (обновление) в конце функции foo()

sutni пишет

...
Функция foo определена в диалоге и занимается его перерисовкой (меняет value у элементов диалога).

Так вот перерисовка элементов на диалоге не происходит...

Скорее всего, неправильно меняете состояние элементов (А value, вроде, вообще на отображение элементов никак не влияет). У меня работает следующий код:
winn.xul

Выделить код

Код:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<dialog id="window" title="0"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<script type="application/x-javascript">
function hello ()
{
    alert ("hello");
}
function tick_dialog ()
{
    var flag = document. getElementById ("cb000"). getAttribute ("checked");
    flag = !flag;
    document. getElementById ("cb000"). checked = flag;
    window. setTimeout (tick_dialog, 200);
}
</script>    
<checkbox id="cb000" checked="true" label="1"/>

</dialog>

который я запускаю из Custom Button скриптом:

Выделить код

Код:

var ww = openDialog("file:///P:/xul/winn.xul", "", "chrome,dialog=yes,modal=false, centerscreen");
window. setTimeout (function () {ww.tick_dialog()}, 1000);

А если в Вашем примере попробовать выполнить след. код

Выделить код

Код:

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);		
	}

Сделал. По извращенному, но других путей не вижу.
Если брать в виде примера

Выделить код

Код:

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 с инкрементом шага.

Теперь есть возможность проводить обновление диалога при каждом шаге.

Если у народа есть более удачные решения - всегда рад выслушать.