Skip to content

Commit

Permalink
[UnifiedPDF] When an incremental PDF completes its load, blank pages …
Browse files Browse the repository at this point in the history
…are still visible

https://bugs.webkit.org/show_bug.cgi?id=273917
rdar://127713604

Reviewed by Tim Horton.

While loading an incremental PDF (potentially over a slow network connection), nothing
currently triggers repaints, so we never show pages as they load, nor do we repaint all
the pages when the load completes. This can leave you with blank pages until you scroll
or zoom.

Fix by hooking up some virtual functions on the plugin to give UnifiedPDFPlugin a way
to know when incremental loads progress, finish or cancel. While progressing, fire
a repeating timer every 1s to trigger repaints (we currently can't know which pages
become valid based on data ranges). Also trigger a repaint when the load completes.
This repaints use the coverage rect to only invalidate visible pages.

* Source/WebKit/WebProcess/Plugins/PDF/PDFPluginBase.h:
(WebKit::PDFPluginBase::incrementalLoadingDidProgress):
(WebKit::PDFPluginBase::incrementalLoadingDidCancel):
(WebKit::PDFPluginBase::incrementalLoadingDidFinish):
* Source/WebKit/WebProcess/Plugins/PDF/PDFPluginBase.mm:
(WebKit::PDFPluginBase::streamDidReceiveData):
(WebKit::PDFPluginBase::streamDidFinishLoading):
(WebKit::PDFPluginBase::streamDidFail):
(WebKit::PDFPluginBase::receivedNonLinearizedPDFSentinel):
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/AsyncPDFRenderer.mm:
(WebKit::AsyncPDFRenderer::coverageRectDidChange):
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/PDFDocumentLayout.h:
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/PDFDocumentLayout.mm:
(WebKit::PDFDocumentLayout::contentsSize const):
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/UnifiedPDFPlugin.h:
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/UnifiedPDFPlugin.mm:
(WebKit::UnifiedPDFPlugin::installPDFDocument):
(WebKit::UnifiedPDFPlugin::incrementalLoadingDidProgress):
(WebKit::UnifiedPDFPlugin::incrementalLoadingDidCancel):
(WebKit::UnifiedPDFPlugin::incrementalLoadingDidFinish):
(WebKit::UnifiedPDFPlugin::updatePageBackgroundLayers):
(WebKit::UnifiedPDFPlugin::incrementalLoadingRepaintTimerFired):
(WebKit::UnifiedPDFPlugin::repaintForIncrementalLoad):
(WebKit::UnifiedPDFPlugin::paintContents):

Canonical link: https://commits.webkit.org/278597@main
  • Loading branch information
smfr committed May 10, 2024
1 parent e2ab34f commit 7208a15
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 3 deletions.
4 changes: 4 additions & 0 deletions Source/WebKit/WebProcess/Plugins/PDF/PDFPluginBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,10 @@ class PDFPluginBase : public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr<PDF
virtual Ref<WebCore::Scrollbar> createScrollbar(WebCore::ScrollbarOrientation);
virtual void destroyScrollbar(WebCore::ScrollbarOrientation);

virtual void incrementalLoadingDidProgress() { }
virtual void incrementalLoadingDidCancel() { }
virtual void incrementalLoadingDidFinish() { }

#if ENABLE(PDF_HUD)
void updateHUDLocation();
WebCore::IntRect frameForHUDInRootViewCoordinates() const;
Expand Down
7 changes: 7 additions & 0 deletions Source/WebKit/WebProcess/Plugins/PDF/PDFPluginBase.mm
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,8 @@
if (m_incrementalLoader)
m_incrementalLoader->incrementalPDFStreamDidReceiveData(buffer);
#endif

incrementalLoadingDidProgress();
}

void PDFPluginBase::streamDidFinishLoading()
Expand Down Expand Up @@ -415,6 +417,7 @@
installPDFDocument();
}

incrementalLoadingDidFinish();
tryRunScriptsInPDFDocument();

#if ENABLE(PDF_HUD)
Expand All @@ -436,6 +439,8 @@
if (m_incrementalLoader)
m_incrementalLoader->incrementalPDFStreamDidFail();
#endif

incrementalLoadingDidCancel();
}

#if HAVE(INCREMENTAL_PDF_APIS)
Expand Down Expand Up @@ -518,6 +523,8 @@
if (m_incrementalLoader)
m_incrementalLoader->receivedNonLinearizedPDFSentinel();

incrementalLoadingDidCancel();

if (!m_documentFinishedLoading || m_pdfDocument)
return;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,6 @@
auto pageCoverage = plugin->pageCoverageForRect(coverageRect);
auto pagePreviewScale = plugin->scaleForPagePreviews();

LOG_WITH_STREAM(PDFAsyncRendering, stream << "AsyncPDFRenderer::coverageRectDidChange " << coverageRect << " " << pageCoverage << " - preview scale " << pagePreviewScale);

PDFPageIndexSet unwantedPageIndices;
for (auto pageIndex : m_pagePreviews.keys())
unwantedPageIndices.add(pageIndex);
Expand All @@ -242,6 +240,8 @@

for (auto pageIndex : unwantedPageIndices)
removePreviewForPage(pageIndex);

LOG_WITH_STREAM(PDFAsyncRendering, stream << "AsyncPDFRenderer::coverageRectDidChange " << coverageRect << " " << pageCoverage << " - preview scale " << pagePreviewScale << " - have " << m_pagePreviews.size() << " page previews and " << m_enqueuedPagePreviews.size() << " enqueued");
}

void AsyncPDFRenderer::tilingScaleFactorDidChange(float)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ class PDFDocumentLayout {
float scale() const { return m_scale; }

void updateLayout(WebCore::IntSize pluginSize, ShouldUpdateAutoSizeScale);
WebCore::FloatSize contentsSize() const;
WebCore::FloatSize scaledContentsSize() const;

void setDisplayMode(DisplayMode displayMode) { m_displayMode = displayMode; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,11 @@
return m_pageGeometry[index].rotation;
}

FloatSize PDFDocumentLayout::contentsSize() const
{
return m_documentBounds.size();
}

FloatSize PDFDocumentLayout::scaledContentsSize() const
{
return m_documentBounds.size().scaled(m_scale);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,10 @@ class UnifiedPDFPlugin final : public PDFPluginBase, public WebCore::GraphicsLay

void teardown() override;

void incrementalLoadingDidProgress() override;
void incrementalLoadingDidCancel() override;
void incrementalLoadingDidFinish() override;

void installPDFDocument() override;

#if ENABLE(UNIFIED_PDF_DATA_DETECTION)
Expand Down Expand Up @@ -425,6 +429,9 @@ class UnifiedPDFPlugin final : public PDFPluginBase, public WebCore::GraphicsLay
void updateLayerHierarchy();
void updateLayerPositions();

void incrementalLoadingRepaintTimerFired();
void repaintForIncrementalLoad();

void didChangeScrollOffset() override;
void didChangeIsInWindow();

Expand Down Expand Up @@ -592,6 +599,8 @@ class UnifiedPDFPlugin final : public PDFPluginBase, public WebCore::GraphicsLay
bool m_inActiveAutoscroll { false };
WebCore::Timer m_autoscrollTimer { *this, &UnifiedPDFPlugin::autoscrollTimerFired };

WebCore::Timer m_incrementalLoadingRepaintTimer { *this, &UnifiedPDFPlugin::incrementalLoadingRepaintTimerFired };

RetainPtr<WKPDFFormMutationObserver> m_pdfMutationObserver;

#if PLATFORM(MAC)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,24 @@ static String mutationObserverNotificationString()
m_pdfTestCallback->handleEvent();
m_pdfTestCallback = nullptr;
}
}

void UnifiedPDFPlugin::incrementalLoadingDidProgress()
{
static constexpr auto incrementalLoadRepaintInterval = 1_s;
if (!m_incrementalLoadingRepaintTimer.isActive())
m_incrementalLoadingRepaintTimer.startRepeating(incrementalLoadRepaintInterval);
}

void UnifiedPDFPlugin::incrementalLoadingDidCancel()
{
m_incrementalLoadingRepaintTimer.stop();
}

void UnifiedPDFPlugin::incrementalLoadingDidFinish()
{
m_incrementalLoadingRepaintTimer.stop();
repaintForIncrementalLoad();
}

#if ENABLE(UNIFIED_PDF_DATA_DETECTION)
Expand Down Expand Up @@ -563,6 +580,24 @@ static String mutationObserverNotificationString()
m_pageBackgroundsContainerLayer->setChildren(WTFMove(pageContainerLayers));
}

void UnifiedPDFPlugin::incrementalLoadingRepaintTimerFired()
{
repaintForIncrementalLoad();
}

void UnifiedPDFPlugin::repaintForIncrementalLoad()
{
auto coverageRect = FloatRect { { }, m_documentLayout.contentsSize() };

if (auto* tiledBacking = m_contentsLayer->tiledBacking()) {
coverageRect = tiledBacking->coverageRect();

coverageRect = convertDown(CoordinateSpace::Contents, CoordinateSpace::PDFDocumentLayout, coverageRect);
}

setNeedsRepaintInDocumentRect(RepaintRequirement::PDFContent, coverageRect);
}

void UnifiedPDFPlugin::paintBackgroundLayerForPage(const GraphicsLayer*, GraphicsContext& context, const FloatRect& clipRect, PDFDocumentLayout::PageIndex pageIndex)
{
auto destinationRect = m_documentLayout.layoutBoundsForPageAtIndex(pageIndex);
Expand Down Expand Up @@ -895,7 +930,6 @@ static String mutationObserverNotificationString()
paintBackgroundLayerForPage(layer, context, clipRect, *backgroundLayerPageIndex);
return;
}

}

PDFPageCoverage UnifiedPDFPlugin::pageCoverageForRect(const FloatRect& clipRect) const
Expand Down

0 comments on commit 7208a15

Please sign in to comment.