3

Firefox のdrawWindow()関数は、最初のパラメーターとして、低レベル APIタブ utilsによって提供されるXUL コンテンツ ウィンドウを想定しています。

ただし、Firefox (コードネーム Electrolysis または e10s) にマルチプロセス アーキテクチャが導入されたため、低レベル API を介してタブに直接アクセスすることはできなくなりました利用可能な互換性 shim がありますが、それらはDOM オブジェクトを必要とするプラットフォーム API をサポートしないことが明示的に述べられています。一方、「クロムのみ」drawWindow()であるため、コンテンツスクリプトでは使用できません。

だから私の質問はこれらです:

  1. drawWindow()クロムの外で使用できず、クロム内で contentWindow オブジェクトを取得できない場合、どのように使用すればよいですか?
  2. アドオンがマルチプロセス Firefox 内で Web サイトのスクリーンショットを撮れるようにする他のオプションは何ですか?

私たちの現在のアプローチは、この SO question への回答に基づいています。ただし、マルチプロセス Firefox では動作しません。

4

1 に答える 1

1

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-script から呼び出されます。

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);
}

関連する読書:

于 2016-01-06T09:28:28.760 に答える