2013-04-18 2 views
0

Я разрабатываю загрузочный Firefox-аддон. В моей startup функции Я построения нового экземпляра объекта, который создает новое окно Firefox со следующим кодом:XUL/Firefox: создать новое окно браузера при загрузке аддона

function createWindow (cb) { 
    const appHiddenWindow = Services.appShell.applicationProvidedHiddenWindow 
     , hidden = Services.appShell.hiddenDOMWindow; 

    // For definition of OpenBrowserWindow() see 
    // http://mxr.mozilla.org/mozilla-central/source/browser/base/content/browser.js 
    // Prior to Firefox 20 "private" option is silently ignored 
    let parent = appHiddenWindow ? hidden : RecentWindow.getMostRecentBrowserWindow() 
     , window = parent.OpenBrowserWindow({ private: true }); 
    window.addEventListener("load", onWindowLoad); 
    return window; 

    function onWindowLoad (e) { 
     window.removeEventListener("load", onWindowLoad); 
     window.gBrowser.addEventListener("pageshow", onPageShow); 
    } 

    function onPageShow (e) { 
     dump("onPageShow\n"); 
     try { 
      cb(window); 
     } catch (e) {} 
    } 
} 

по неизвестной для меня причинам этот код ведет себя по-разному в разных условиях: на Firefox срок до 20, если он выполняется при запуске приложения, onPageShow callback никогда не срабатывает. Я предполагаю, что это потому, что gBrowserselectedBrowser просто не загружает главную страницу и останавливается после загрузки about:blank. Почему он загружает главную страницу в новом окне, когда я повторно активирую мое расширение вручную (когда Firefox уже загружен)?

Проблема возникает, когда она загружает домашнюю страницу в selectedBrowser (в новых версиях Fx): в этом случае он не загружает URL-адрес, указанный мной, и вместо этого продолжает загружать мою домашнюю страницу.

Так как я могу определить, будет ли gBrowser собираться загрузить домашнюю страницу или нет? И почему это происходит по-разному при запуске приложения и при повторной активации аддона?

PS: Для приведенной выше коды для работы нужно сделать эти import с и использовать следующий запасной вариант:

Cu.import("resource://gre/modules/Services.jsm"); 
try { 
    Cu.import("resource:///modules/RecentWindow.jsm"); 
} catch (e) { // Firefox prior to v20 
    var RecentWindow = { 
     getMostRecentBrowserWindow: function() 
      Services.wm.getMostRecentWindow("navigator:browser") 
    }; 
} 
+0

Я нахожусь в Mac OS, если это имеет значение. – nilfalse

+0

Почему вы не следуете более традиционному пути добавления слушателя к оконному медиатору? – paa

+0

В моем приложении мне нужно мое собственное (дополнительное) окно, которое открывается самим аддоном. Это окно будет работать в фоновом режиме. В случае использования оконного посредника мне нужно будет открыть новое окно вручную, правильно ли я понял? – nilfalse

ответ

0

Кажется, я был неправ в некоторых из моих предположений. Мне не нужно ждать до pageshow события. После долгого исследования я нашел это bug. В соответствии с этим есть уведомление наблюдателя browser-delayed-startup-finished, которого достаточно, чтобы начать делать то, что я имел отношение к window.