【问题标题】:drawWindow() broken with multiprocess Firefox (e10s)?drawWindow() 被多进程 Firefox (e10s) 破坏?
【发布时间】:2016-01-04 17:38:57
【问题描述】:

Firefox drawWindow()-Function 的第一个参数是 XUL content-window,由低级 API tab utils 提供。

然而,在 Firefox 中引入多进程架构(代号为电解或 e10s)后,通过低级 api 直接访问选项卡是 no longer possible。虽然有可用的兼容性填充程序,但明确指出它们不support plattform APIs that expect DOM objects。 另一方面,drawWindow() 不能在内容脚本中使用,因为它是 "chrome only"

所以我的问题是:

  1. 如果我无法在 chrome 之外使用 drawWindow() 并且无法在 chrome 中获取 contentWindow 对象,我应该如何使用它?
  2. 还有哪些其他选项可以让我的插件在多进程 Firefox 中截取网站截图?

我们目前的方法是基于on the answer to this SO question。但是它不适用于多进程 Firefox

【问题讨论】:

  • 它肯定会在框架脚本中工作。迫切需要与框架一起使用的整页屏幕截图。甚至内置的 Firefox 节点截图工具有时也会失败。这是一个框架脚本的例子 - github.com/Noitidart/Full-Stop
  • 我认为框架脚本和内容脚本是相同的,但这显然是错误的? sigh 我现在将研究框架脚本,希望它有效。谢谢你:)
  • 它非常不同,要查看如何使用 framescript 中的内容脚本,请参阅此插件 - github.com/Noitidart/Tweeeeeeeeeeeeeeeeeeter

标签: firefox firefox-addon firefox-addon-sdk jpm e10s


【解决方案1】:

使用 drawWindow() 的解决方案确实是使用 cmets 中 Noitidart 建议的框架脚本。我用于屏幕截图的框架脚本如下所示:

addMessageListener("fs/make_screenshot_from_rectangle", makeScreenshot);

function makeScreenshot(payload) {
    var rectangle = payload.data;
    var startX = rectangle.startX || 0;
    var startY = rectangle.startY || 0;
    var width = rectangle.width || content.innerWidth;
    var height = rectangle.height || content.innerHeight;
    // Create canvas to draw window unto
    var canvas = content.document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
    canvas.width = width;
    canvas.height = height;
    // Create context for drawing, draw the old window unto the canvas
    var context = canvas.getContext("2d");
    context.drawWindow(content, startX, startY, width, height, "rgb(255,255,255)");
    // Save context as png
    var image = canvas.toDataURL('image/png');
    sendAsyncMessage("got-screenshot", image);
}

它是通过具有以下功能的 chrome 脚本调用的:

function (rectangle) {
    var tab = require("sdk/tabs").activeTab;
    var xulTab = require("sdk/view/core").viewFor(tab);
    var xulBrowser = require("sdk/tabs/utils").getBrowserForTab(xulTab);

    var browserMM = xulBrowser.messageManager;
    if ( /* framescript not yet attached to tab */ ) {
        browserMM.loadFrameScript(require("sdk/self").data.url("content-scripts/frame-script.js"), false);
        ... // do something to remember that there is a framescript attached to the tab
        browserMM.addMessageListener("got-screenshot", function (payload) {
            ... // handle the screenshot
        });
    }
    browserMM.sendAsyncMessage('fs/make_screenshot_from_rectangle', rectangle);
}

相关阅读:

【讨论】:

  • 非常感谢分享!这是一项了不起的工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2018-10-07
相关资源
最近更新 更多