Как мне сравнить Application.windows [x] с Application.activeWindow? - PullRequest
2 голосов
/ 07 апреля 2011

Я создаю расширение Firefox, в котором я хочу перебрать массив Application.windows и проверить, совпадает ли один из его элементов с Application.activeWindow.
Упомянутая выдержка из моего кода выглядит так:

for (var i in Application.windows) {
    if (Application.windows[i]==Application.activeWindow) alert('debug');
    // there was some more complex code than alert('debug'),
    // but since it didn't work, I decided to try with an alert
}

К сожалению, оповещение об отладке никогда не просматривается. Поэтому я решил попробовать этот код (с открытым только одним окном):

// the following code runs in an event listener for window.onload
alert(Application.windows[0]);
alert(Application.activeWindow);
alert(Application.windows[0]==Application.activeWindow);

Firefox отобразил 3 предупреждения: первое было [object Object], второе - [xpconnect wrapped fuelIWindow], а последнее (что меня не удивило) показало false. Похоже, объекты, которые я пытаюсь сравнить, имеют разные типы. Как я могу справиться с этим? Заранее спасибо.

1 Ответ

1 голос
/ 11 апреля 2011

У вас две проблемы.

Во-первых, XPConnect не поддерживает свойства массива, поэтому, когда FUEL (или STEEL или SMILE) возвращают массив, они фактически возвращают nsIVariant внутренних объектов! С другой стороны, однозначные объекты возвращают оболочку XPConnect, которая скрывает внутренний объект.

Во-вторых, каждый раз, когда вы обращаетесь к windows или activeWindow, создаются новые внутренние объекты, поэтому даже два вызова activeWindow возвращают разные объекты.

Способ избежать этого - избегать ТОПЛИВА и перечислять окна напрямую, используя оконный посредник .

...