2016-01-04 6 views
3

Firefox drawWindow() -Функция ожидает как первый параметр a XUL content-window, предоставляемый низкоуровневым api tab utils.drawWindow() разбит на многопроцессорный Firefox (e10s)?

Однако с внедрением многопроцессорной архитектуры в Firefox (кодовое электролиз или e10s) прямой доступ к вкладкам с помощью низкоуровневого api составляет no longer possible. Несмотря на наличие совместимых прокладок, в явном виде указано, что они не support plattform APIs that expect DOM objects. С другой стороны, drawWindow() не может использоваться в скрипте контента, так как он равен "chrome only".

Так мои вопросы таковы:

  1. Как я должен использовать drawWindow(), если я не могу использовать его вне хрома и не может получить contentWindow-объект в хроме?
  2. Каковы мои другие варианты, позволяющие моему аддону делать скриншоты веб-сайтов в многопроцессорном Firefox?

Наш текущий подход основан на on the answer to this SO question. Однако он не будет работать с многопроцессорным Firefox

+1

Он будет работать из фреймворка точно. Существует острая потребность в полном скриншотах страниц, которые работают с фреймами. Даже встроенный инструмент скриншотов узла firefox не работает. Вот пример framecript - https://github.com/Noitidart/Full-Stop – Noitidart

+1

Я предположил, что фреймворки и контент-скрипты одинаковы, но это, по-видимому, неправильно - иш? * sigh * Теперь я буду смотреть в рамки, надеюсь, это сработает. Спасибо :) –

+0

Его очень разные, чтобы увидеть, как использовать скрипт контента из framecript, см. Этот аддон - https://github.com/Noitidart/Tweeeeeeeeeeeeeeeeeeter – Noitidart

ответ

1

Решение использовать drawWindow() было действительно использовать фреймворки, предложенные Noitidart в комментариях. FrameScript я использую для скриншотов выглядит следующим образом:

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

И это вызывается из хромированного сценария с помощью следующей функции:

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

Соответствующего чтение:

+0

Большое спасибо за обмен! Это фантастическая работа! – Noitidart