firefox - 多进程 Firefox (e10s) 破坏了drawWindow()?

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

火狐 drawWindow() -函数需要第一个参数 a XUL content-window由低级 API tab utils 提供.

然而,随着 Firefox 中引入多进程架构(代号 electrothesis 或 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

最佳答案

使用drawWindow()的解决方案确实是使用框架脚本,正如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);
}

相关阅读:

关于firefox - 多进程 Firefox (e10s) 破坏了drawWindow()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34596722/

相关文章:

javascript - 从扩展程序中获取所选选项卡的 URL

javascript - 火狐SDK : how to use emit for sidebar outside widget

javascript - 更改选项卡 javascript firefox 扩展的 url

javascript - 自动运行 firefox 扩展 jpm

css - 奇怪的跨度换行

android - "Request Desktop Site"与 Xamarin Android 中的 Intent

javascript - Firefox DevTools 控制台中的 "Jump to definition"跳转到缩小的 JavaScript

jquery - 如何让 jQuery 效果在 Firefox 和 Google Chrome 上运行?

javascript - 火狐插件。如何真正下载图像/文件?

Firefox 插件,如何跟踪新选项卡的来源?