Как манипулировать прототипом окна в элементе браузера?

Что я делаю прямо сейчас:

Когда <browser src="..." /> загружается, я добавляю данные в его .contentWindow:

frame.addEventListener("load",function(){
    this.contentWindow.someMethod = function(){};
},true);

Теперь я хочу знать, есть ли способ сделать это раньше, в прототип окна <browser> или любой прототип окна, как, например, я могу сделать в "текущем" окне:

// [W]indow is the constructor
Window.prototype.test = function(){ alert("hello"); };
// [w]indow is the instance
window.test();

person Community    schedule 28.11.2011    source источник


Ответы (1)


В настоящее время существует два способа внедрить свойства в окно перед запуском любого кода JavaScript. Обычно проще использовать content-document-global-created уведомление. Другой — реализующий nsIDOMGlobalPropertyInitializer интерфейс. Оба позволяют получать уведомления при загрузке нового окна и до того, как в этом окне запустится код JavaScript.

Вот приблизительный код для этого с уведомлением наблюдателя:

const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");

var myObserver =
{
  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),

  observe: function(subject, topic, data)
  {
    if (topic == "content-document-global-created" &&
        subject instanceof Ci.nsIDOMWindow &&
        subject.location.hostname == "example.com")
    {
      XPCNativeWrapper.unwrap(subject).someMethod = function() {};
    }
  }
};

var observerService = Cc["@mozilla.org/observer-service;1"]
                        .getService(Ci.nsIObserverService);
observerService.addObserver(myObserver, "content-document-global-created", true);
person Wladimir Palant    schedule 28.11.2011
comment
@Wladimir, не могли бы вы указать, где именно разместить этот код? Я попытался поместить его в сценарий, указанный в элементе ‹overlay› в моем файле .xul, но, похоже, это не дало никакого эффекта. - person Marek; 14.11.2013