监视所有当前和未来Windows +标签的窗口打开,关闭,DOMContentLoaded事件

Dav*_*esh 7 javascript firefox screen-scraping xul

背景:

我被授权 "自动化"第三方网站,目的是将"服务订单"推入其中并监控这些请求的进度.

我尝试采用正常的"抓取"方法(使用WWW::Mechanize,HTML::Query等等来自Perl)但遇到了很多问题,预测网站中的JavaScript在各种情况下会做什么.如果我得到运行第三方网站的产品的供应商的支持,或者可以获得一些更好的文档以及产品的业务规则,我打算回到这种方法.

为了避免第二次猜测JavaScript代码,并节省大量时间,我最终采取了一种方法,我在专用VM上加载Firefox中的第三方网站,然后执行"特权"代码(即:nsI*)该网站的上下文"驱动"和"刮"该网站.

我目前正在使用nsIWebProgressListener/ DOMContentLoaded(当我已经有一个ChromeWindow的引用时),并且nsIWindowMediator调用window + tab枚举setInterval来查找新的窗口和标签(当我无法预测它们打开时,也没有获得对它们的DOMWindow对象的引用由于第三方JavaScript的范围).

问题: 如何通过第三方网站的JavaScript现在(以及将来)打开的每个窗口/标签中自动安装"钩子"?nsI~在这种情况下,像整个Firefox UI 的"窗口观察器" 界面之类的东西将非常有用.

h0t*_*1r3 1

有很多方法可以做到这一点,因此正确的选择取决于您如何处理其他事情。

这里只是一些倾听的方式,而不是轮询。

  1. 新的 Chrome 窗口

    function ChromeWindowObserver() {
        this.observe = function(subject, topic, data) {
           // subject is a ChromeWindow
        }
    }
    Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
          .getService(Components.interfaces.nsIWindowWatcher)
          .registerNotification(new ChromeWindowObserver());
    
    Run Code Online (Sandbox Code Playgroud)
  2. 新标签

    function tabListener(event) {
        var browser = gBrowser.getBrowserForTab(event.target):
    }
    gBrowser.tabContainer.addEventListener("TabOpen", tabListener, false);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 观察者通知(我最喜欢的)

    const dumpObserver = {
        observe: function(subject, topic, data) { dump(topic + "\n"); }
    }
    const domObserver = {
        observe: function(subject, topic, data) { dump(subject.location + "\n"); }
    }
    const ObserverService = Components.classes["@mozilla.org/observer-service;1"]
          .getService(Components.interfaces.nsIObserverService);
    
    /* debug log notifications */
    ObserverService.addObserver(dumpObserver, "*", false);
    /* debug log all new content locations */
    ObserverService.addObserver(domObserver, "content-document-global-created", false);
    
    Run Code Online (Sandbox Code Playgroud)

旁注,请查看JavaScript 代码模块。我认为这可能对您在 Chrome 窗口之间共享数据时有所帮助。