Pdf.js: 内存泄漏:某些事件未未注册

创建于 2019-07-05  ·  9评论  ·  资料来源: mozilla/pdf.js

配置:

  • 网络浏览器及其版本:任何版本
  • 操作系统及其版本:任何操作系统
  • PDF.js 版本:2.2.222
  • 是浏览器扩展:否(我使用通用浏览器来显示嵌入在 Web 应用程序中的 PDF)

在调查https://github.com/stephanrauh/ngx-extended-pdf-viewer/issues/101 时,我注意到有三个事件已注册但从未取消注册。 我想这是内存泄漏。 就我而言,当我在使用 PDF 查看器离开页面后尝试通过 CTRL+P 打印时,这会导致我的 SPA 出现问题。

我想这只是将这三个事件添加到PDFViewerApplication.unbindWindowEvents() 的问题

1-viewer

所有9条评论

谢谢,我觉得你说得对。 我认为这不一定是内存泄漏,但这应该稍微重构一下,以便窗口事件的绑定/解除绑定仅在一个地方。

似乎事情没那么容易,虽然我还不知道为什么:

  • keydown 侦听器在加载 viewer.js 脚本时注册,无论是否有 PDF。
  • 我已经按照我的建议添加了 removeEventListener 。 令我惊讶的是,CMD+P 没有做任何事情(除了突出显示“编辑”菜单几分之一秒)。 也许这是一个 OSX 问题。 我的理论是注册“keydown”事件会自动终止标准键绑定。 如果这是真的,我们可以简单地将它重新绑定到window.print()

顺便说一句,这是我的源代码更改: https :

忘记我的上一篇文章 - 我已经设法让一切正常运行。 从 DOM 中删除 pdf.js 后,可以恢复标准功能。 另请参阅#10948,这是昨天让我感到困惑的意外副作用。

在 pull request #11380 中,三个注册的事件侦听器中的两个现在在重置时也未注册。 此问题仅保留打印 keydown 事件侦听器。

在 pull request #11380 中,三个注册的事件侦听器中的两个现在在重置时也未注册。

是的,但是这些事件只是被间接修复了,因为出于其他原因(例如与其他组件的一致性)允许重置PDFHistory实例是有意义的。

虽然在一般我会动心建议WONTFIX为PDFPrintService代码,有两个原因:

  • 这个问题声称存在内存泄漏,但实际上并没有提供任何证据来支持它。
  • 默认查看器真正支持的唯一嵌入是<iframe> ,我无法想象这些事件侦听器会引起任何麻烦。 [1]
  • 这根本不会影响FirefoxPrintService ,因为它没有注册任何事件。 因此,试图在PDFPrintService “修复”这个会导致不同的PDFPrintServiceFactory接口“不平衡”。
  • web/pdf_print_service.js注册了许多window事件,我认为您需要在加载后立即注册它们,以免错过任何事件和/或不是第一个事件处理程序。 因此,删除这些事件侦听器可能会导致以后出现意外行为。

[1] 另请注意http://mozilla.github.io/pdf.js/getting_started/#introduction (重点是我的):

查看器构建在显示层上,是 Firefox 中 PDF 查看器和项目中其他浏览器扩展的 UI。 它可以是构建您自己的查看器的一个很好的起点。 但是,我们会询问您是否打算将查看器嵌入您自己的网站,而不仅仅是未修改的版本。

@Snuffleupagus我无法回避您不赞成 ngx-extended-pdf-viewer 项目的印象。 这样对吗? 如果是这样,为什么?

只是为了记录:ngx-extended-pdf-viewer 确实建立在 pdf.js 之上。 它向核心 pdf.js 文件添加了 62 处修改。 它还增加了很多附加价值,尤其是与 iFrame 方法相比。 目前,皮肤有限。 据我所知,几乎每个用户都在使用它。 高级蒙皮(即 Material Design 和 Bootstrap4)在用户的愿望清单之上,所以很快就会出现。

总而言之,我很惊讶您如此频繁地强调“重新皮肤或构建”这一点。

我无法回避您不赞成 ngx-extended-pdf-viewer 项目的印象。

老实说,我什至不知道“ngx-extended-pdf-viewer”项目是什么,而且现在圣诞节即将来临,我没有时间弄清楚,因此我显然对此没有意见:-)


一般来说,不挑出任何特定项目:不应该按原样使用默认查看器的原因是为了避免自定义应用程序由于看起来或多或少而被误认为是 Firefox 中的内置 PDF 查看器与许多用户相同。

@Snuffleupagus谢谢! 这是一个很好的理由,我可以使用它。 我会看看我能做些什么让“我的”嵌入式查看器看起来不同。 在大多数情况下,它看起来会有所不同,因为它不是整页查看器,但当然,我不想在您的错误跟踪器上看到我的错误。

我可以提供的是:如果有人提交错误报告并提到“Angular”,请抄送我。

最好的问候,圣诞快乐
斯蒂芬

你真是太好了,谢谢! 一般来说,我们提到换肤是因为我们看到 PDF.js 的自定义部署中的错误在此处报告的相对频繁,因为用户认为他们正在与官方查看器打交道,而实际上他们正在查看默认查看器的未换肤副本。 为了避免这种情况,我们通常会提到这一行,但在这种情况下,它只是为了表明像您一样扩展 PDF.js 实际上是可以/推荐的,所以不用担心!

如果您在 PDF.js 中发现问题,请随时报告它们。 我们已经根据您的问题/评论修复了一些问题,因此非常有帮助。

此页面是否有帮助?
0 / 5 - 0 等级