FF4/JetPack 上的 HTML5 画布绘制窗口错误

发布于 2024-11-02 23:31:02 字数 2360 浏览 3 评论 0原文

我借用了thumbnail.js 的代码对其进行了修改,以便它可以截取整个页面的屏幕截图(至少是这个想法),

  Code:
    function takeScreenshot(window) {
       const { Cc, Ci, Cu } = require("chrome");
       const AppShellService = Cc["@mozilla.org/appshell/appShellService;1"].
         getService(Ci.nsIAppShellService);

      var ss = AppShellService.hiddenDOMWindow.document
                        .createElementNS("http://www.w3.org/1999/xhtml", "canvas");
      ss.mozOpaque = true;
      ss.width = window.innerWidth;
      ss.height = window.innerHeight;
      var ctx = ss.getContext("2d");
      ctx.drawWindow(window, 0, 0, 500, 500, "rgb(255,255,255)"); // here is line 18 - where the error occured
      return ss.toDataURL();
    }

但我收到了一个错误......

  Code:
    Traceback (most recent call last):
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-api-utils-lib/timer.js", line 64, in notifyOnTimeout
        this._callback.apply(null, this._params);
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-api-utils-lib/content/worker.js", line 64, in emitter
        emit.apply(scope, params);
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-api-utils-lib/events.js", line 147, in _emit
        return this._emitOnObject.apply(this, args);
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-api-utils-lib/events.js", line 177, in _emitOnObject
        listener.apply(targetObj, params);
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-addon-kit-lib/context-menu.js", line 609, in workerOnMessage
        item.onMessage(msg);see error
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-what-inspires-me-lib/main.js", line 27, in null
        var imgdata = takeScreenshot(tabs.activeTab.window);
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-what-inspires-me-lib/main.js", line 18, in takeScreenshot
        ctx.drawWindow(window, 0, 0, 500, 500, "rgb(255,255,255)");
    [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMCanvasRenderingContext2D.draw
    Window]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: resource://jid0-qpxlmo42unizthqqbyuvdj
    hd59y-api-utils-lib/securable-module.js -> resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-what-inspires-me-lib/main.j
    s :: takeScreenshot :: line 18"  data: no]

问题是什么?

I borrowed code from thumbnail.js modified it so that it takes screenshot of the entire page (at least thats the idea)

  Code:
    function takeScreenshot(window) {
       const { Cc, Ci, Cu } = require("chrome");
       const AppShellService = Cc["@mozilla.org/appshell/appShellService;1"].
         getService(Ci.nsIAppShellService);

      var ss = AppShellService.hiddenDOMWindow.document
                        .createElementNS("http://www.w3.org/1999/xhtml", "canvas");
      ss.mozOpaque = true;
      ss.width = window.innerWidth;
      ss.height = window.innerHeight;
      var ctx = ss.getContext("2d");
      ctx.drawWindow(window, 0, 0, 500, 500, "rgb(255,255,255)"); // here is line 18 - where the error occured
      return ss.toDataURL();
    }

but I got an error ...

  Code:
    Traceback (most recent call last):
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-api-utils-lib/timer.js", line 64, in notifyOnTimeout
        this._callback.apply(null, this._params);
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-api-utils-lib/content/worker.js", line 64, in emitter
        emit.apply(scope, params);
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-api-utils-lib/events.js", line 147, in _emit
        return this._emitOnObject.apply(this, args);
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-api-utils-lib/events.js", line 177, in _emitOnObject
        listener.apply(targetObj, params);
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-addon-kit-lib/context-menu.js", line 609, in workerOnMessage
        item.onMessage(msg);see error
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-what-inspires-me-lib/main.js", line 27, in null
        var imgdata = takeScreenshot(tabs.activeTab.window);
      File "resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-what-inspires-me-lib/main.js", line 18, in takeScreenshot
        ctx.drawWindow(window, 0, 0, 500, 500, "rgb(255,255,255)");
    [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMCanvasRenderingContext2D.draw
    Window]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: resource://jid0-qpxlmo42unizthqqbyuvdj
    hd59y-api-utils-lib/securable-module.js -> resource://jid0-qpxlmo42unizthqqbyuvdjhd59y-what-inspires-me-lib/main.j
    s :: takeScreenshot :: line 18"  data: no]

whats the problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

萌辣 2024-11-09 23:31:02

这可能太旧了,但以防万一其他人偶然发现这一点。以下代码适用于 FF 3.0 至 FF 6 Beta

// Mostly taken from
// http://wiki.github.com/bard/mozrepl/interactor-screenshot-server
function (tab,rect) {
    var browserWindow = Components.classes['@mozilla.org/appshell/window-mediator;1']
        .getService(Components.interfaces.nsIWindowMediator)
        .getMostRecentWindow('navigator:browser');
    var canvas = browserWindow
           .document
           .createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
    var browser = tab.linkedBrowser;
    var win = browser.contentWindow;
    var left = rect.left || 0;
    var top = rect.top || 0;
    var width = rect.width || win.document.body.clientWidth;
    var height = rect.height || win.document.body.clientHeight;
    canvas.width = width;
    canvas.height = height;
    var ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, width, height);
    ctx.save();
    ctx.scale(1.0, 1.0);
    ctx.drawWindow(win, left, top, width, height, 'rgb(255,255,255)');
    ctx.restore();

    //return atob(
    return canvas
           .toDataURL('image/png', '')
           .split(',')[1]
    // );
}

This is likely far too old, but in case somebody else stumbles on this. The following code works for me on FF 3.0 up to FF 6 Beta

// Mostly taken from
// http://wiki.github.com/bard/mozrepl/interactor-screenshot-server
function (tab,rect) {
    var browserWindow = Components.classes['@mozilla.org/appshell/window-mediator;1']
        .getService(Components.interfaces.nsIWindowMediator)
        .getMostRecentWindow('navigator:browser');
    var canvas = browserWindow
           .document
           .createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
    var browser = tab.linkedBrowser;
    var win = browser.contentWindow;
    var left = rect.left || 0;
    var top = rect.top || 0;
    var width = rect.width || win.document.body.clientWidth;
    var height = rect.height || win.document.body.clientHeight;
    canvas.width = width;
    canvas.height = height;
    var ctx = canvas.getContext('2d');
    ctx.clearRect(0, 0, width, height);
    ctx.save();
    ctx.scale(1.0, 1.0);
    ctx.drawWindow(win, left, top, width, height, 'rgb(255,255,255)');
    ctx.restore();

    //return atob(
    return canvas
           .toDataURL('image/png', '')
           .split(',')[1]
    // );
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文