Как манипулировать прототипом окна в элементе <browser>? - PullRequest
0 голосов
/ 28 ноября 2011

То, что я сейчас делаю, это:

Когда <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();

1 Ответ

4 голосов
/ 28 ноября 2011

В настоящее время существует два способа внедрить свойства в окно перед выполнением любого кода 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);
...