Как проверить, открыто ли данное окно в Xul? - PullRequest
1 голос
/ 02 февраля 2011

Как проверить, открыто ли данное окно в Xul?

Я хотел бы проверить, открылось ли уже окно в моем настольном приложении.Поэтому, если это так, я не буду открывать его снова.

- моя попытка

Я пытаюсь выполнить это, используя заголовок окна, поэтому я получаюсписок окон из windowManager и проверьте заголовок, но getAttribute не из интерфейса, который я могу запросить, это из элемента , какой интерфейс я должен использовать?

var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);
var enum = windowManager.getXULWindowEnumerator(null);
while(enum.hasMoreElements()) {
    var win = enum.getNext().QueryInterface(Components.interfaces[" WHICH INTERFACE TO PUT HERE? "]);
    write("WINDOW TITLE = " + win.getAttribute("title"));
}

Ответы [ 2 ]

3 голосов
/ 06 февраля 2011

Если вы установите атрибут windowtype="myWindowType" в элементе <window> документа, то вы можете просто использовать windowMediator.getMostRecentWindow('myWindowType');, чтобы посмотреть, есть ли у вас его уже открытый.

1 голос
/ 03 февраля 2011
var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);
var enum = windowManager.getEnumerator(null);
while(enum.hasMoreElements()) {
  var win = enum.getNext().QueryInterface( Components.interfaces.nsIDOMChromeWindow );
  write("WINDOW TITLE = " + win.document.documentElement.getAttribute("title") );
}

если вы используете getXULWindowEnumerator, вы должны использовать Components.interfaces.nsIXULWindow

, вы, вероятно, можете использовать имя атрибута nsIDOMWindow, если вы открываете окна самостоятельно, потому что вы задаете имя окна воткрыть функцию.Это невидимо для пользователя, поэтому у вас есть немного больше гибкости

var win = window.open( "chrome://myextension/content/about.xul", 
                          "windowName", "chrome,centerscreen" );

write( "WINDOW NAME: " + win.name ); // Should now give  WINDOW NAME: windowName

Если вы оставите имя окна пустым, оно будет каждый раз открывать новое окно.Однако, если вы используете имя окна (что-то другое, чем ""), оно создаст его, если оно не существует, или загрузит новый контент в уже существующее окно с указанным вами именем.

Это выглядит какпочти то, что вы хотите.Но вы можете использовать атрибут name, чтобы избежать перезагрузки, если нужно.

var openNewWindow = true;
var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(Components.interfaces.nsIWindowMediator);
var enum = windowManager.getEnumerator(null);

while(enum.hasMoreElements()) {
  var win = enum.getNext().QueryInterface( Components.interfaces.nsIDOMChromeWindow );
  if( win.name == "windowName" ) {
    openNewWindow = false;
  }
}

if( openNewWindow ) {
  var win = window.open( "chrome://myextension/content/about.xul", 
                      "windowName", "chrome" );
}
...