7

背景:

我被授权“自动化”第三方站点,以便将“服务订单”推送到其中并监控这些请求的进度。

我尝试采用普通的“抓取”方法(使用PerlWWW::Mechanize中的 ,​​ 等),但在预测站点中的 JavaScript 在各种情况下会做什么时HTML::Query遇到了很多问题。如果我从运行 3rd 方站点的产品供应商那里获得支持,或者可以获得一些更好的产品业务规则文档,我打算回到这种方法。

为了避免再次猜测 JavaScript 代码并节省大量时间,我最终采取了一种方法,即在专用 VM 上加载 Firefox 中的第 3 方站点,然后在其中执行“特权”代码(即:nsI*)站点的上下文来“驱动”和“抓取”站点。

我目前正在使用nsIWebProgressListener/ DOMContentLoaded(当我已经有对 ChromeWindow 的引用时),并且nsIWindowMediator从调用 window+tab 枚举setInterval来查找新窗口和选项卡(当我无法预测它们打开时,也无法获得对其 DOMWindow 对象的引用由于第 3 方 JavaScript 的作用域)。

问题: 我怎样才能在现在(以及将来)由 3rd 方站点的 JavaScript 打开的每个窗口/选项卡中自动安装一个“挂钩”?在这种情况下,整个 Firefox UI的“窗口观察器”nsI~界面将非常有用。

4

1 回答 1

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());
    
  2. 新标签

    function tabListener(event) {
        var browser = gBrowser.getBrowserForTab(event.target):
    }
    gBrowser.tabContainer.addEventListener("TabOpen", tabListener, false);
    
  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);
    

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

于 2013-01-09T21:10:46.603 回答