Skip to content

Commit

Permalink
Adopt dynamicDowncast<> in ImageLoader and RenderImage
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=267209

Reviewed by Chris Dumez.

* Source/WebCore/loader/ImageLoader.cpp:
(WebCore::ImageLoader::updateFromElement):
(WebCore::ImageLoader::renderImageResource):
(WebCore::ImageLoader::decode):
(WebCore::ImageLoader::imageVisibleInViewport const):
* Source/WebCore/rendering/RenderImage.cpp:
(WebCore::RenderImage::RenderImage):
(WebCore::RenderImage::notifyFinished):
(WebCore::isDeferredImage):
(WebCore::RenderImage::paintAreaElementFocusRing):
(WebCore::RenderImage::paintIntoRect):
(WebCore::RenderImage::updateAltText):
(WebCore::RenderImage::computeIntrinsicRatioInformation const):
(WebCore::RenderImage::embeddedContentBox const):

Canonical link: https://commits.webkit.org/272781@main
  • Loading branch information
annevk committed Jan 8, 2024
1 parent 502dd99 commit d4c1f69
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 52 deletions.
39 changes: 16 additions & 23 deletions Source/WebCore/loader/ImageLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,12 +206,11 @@ void ImageLoader::updateFromElement(RelevantMutation relevantMutation)
options.loadedFromPluginElement = is<HTMLPlugInElement>(element()) ? LoadedFromPluginElement::Yes : LoadedFromPluginElement::No;
options.sameOriginDataURLFlag = SameOriginDataURLFlag::Set;
options.serviceWorkersMode = is<HTMLPlugInElement>(element()) ? ServiceWorkersMode::None : ServiceWorkersMode::All;
bool isImageElement = is<HTMLImageElement>(element());
if (isImageElement) {
auto& imageElement = downcast<HTMLImageElement>(element());
options.referrerPolicy = imageElement.referrerPolicy();
options.fetchPriorityHint = imageElement.fetchPriorityHint();
if (imageElement.usesSrcsetOrPicture())
RefPtr imageElement = dynamicDowncast<HTMLImageElement>(element());
if (imageElement) {
options.referrerPolicy = imageElement->referrerPolicy();
options.fetchPriorityHint = imageElement->fetchPriorityHint();
if (imageElement->usesSrcsetOrPicture())
options.initiator = Initiator::Imageset;
}

Expand Down Expand Up @@ -244,9 +243,8 @@ void ImageLoader::updateFromElement(RelevantMutation relevantMutation)
#if !LOG_DISABLED
auto oldState = m_lazyImageLoadState;
#endif
if (m_lazyImageLoadState == LazyImageLoadState::None && isImageElement) {
auto& imageElement = downcast<HTMLImageElement>(element());
if (imageElement.isLazyLoadable() && document.settings().lazyImageLoadingEnabled() && !canReuseFromListOfAvailableImages(request, document)) {
if (m_lazyImageLoadState == LazyImageLoadState::None && imageElement) {
if (imageElement->isLazyLoadable() && document.settings().lazyImageLoadingEnabled() && !canReuseFromListOfAvailableImages(request, document)) {
m_lazyImageLoadState = LazyImageLoadState::Deferred;
request.setIgnoreForRequestCount(true);
}
Expand Down Expand Up @@ -434,8 +432,8 @@ RenderImageResource* ImageLoader::renderImageResource()

// We don't return style generated image because it doesn't belong to the ImageLoader.
// See <https://bugs.webkit.org/show_bug.cgi?id=42840>
if (is<RenderImage>(*renderer) && !downcast<RenderImage>(*renderer).isGeneratedContent())
return &downcast<RenderImage>(*renderer).imageResource();
if (auto* renderImage = dynamicDowncast<RenderImage>(*renderer); renderImage && !renderImage->isGeneratedContent())
return &renderImage->imageResource();

if (auto* svgImage = dynamicDowncast<LegacyRenderSVGImage>(renderer))
return &svgImage->imageResource();
Expand All @@ -446,8 +444,8 @@ RenderImageResource* ImageLoader::renderImageResource()
#endif

#if ENABLE(VIDEO)
if (is<RenderVideo>(*renderer))
return &downcast<RenderVideo>(*renderer).imageResource();
if (auto* renderVideo = dynamicDowncast<RenderVideo>(*renderer))
return &renderVideo->imageResource();
#endif

return nullptr;
Expand Down Expand Up @@ -528,14 +526,12 @@ void ImageLoader::decode()
return;
}

Image* image = m_image->image();
if (!is<BitmapImage>(image)) {
RefPtr bitmapImage = dynamicDowncast<BitmapImage>(m_image->image());
if (!bitmapImage) {
resolveDecodePromises();
return;
}

auto& bitmapImage = downcast<BitmapImage>(*image);
bitmapImage.decode([promises = WTFMove(m_decodingPromises)]() mutable {
bitmapImage->decode([promises = WTFMove(m_decodingPromises)]() mutable {
resolvePromises(promises);
});
}
Expand Down Expand Up @@ -646,11 +642,8 @@ VisibleInViewportState ImageLoader::imageVisibleInViewport(const Document& docum
if (&element().document() != &document)
return VisibleInViewportState::No;

auto* renderer = element().renderer();
if (!is<RenderReplaced>(renderer))
return VisibleInViewportState::No;

return downcast<RenderReplaced>(*renderer).isContentLikelyVisibleInViewport() ? VisibleInViewportState::Yes : VisibleInViewportState::No;
auto* renderReplaced = dynamicDowncast<RenderReplaced>(element().renderer());
return renderReplaced && renderReplaced->isContentLikelyVisibleInViewport() ? VisibleInViewportState::Yes : VisibleInViewportState::No;
}

}
53 changes: 24 additions & 29 deletions Source/WebCore/rendering/RenderImage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,8 +153,8 @@ RenderImage::RenderImage(Type type, Element& element, RenderStyle&& style, Optio
{
updateAltText();
#if ENABLE(SERVICE_CONTROLS)
if (is<HTMLImageElement>(element))
m_hasShadowControls = downcast<HTMLImageElement>(element).isImageMenuEnabled();
if (RefPtr image = dynamicDowncast<HTMLImageElement>(element))
m_hasShadowControls = image->isImageMenuEnabled();
#endif
}

Expand Down Expand Up @@ -397,8 +397,8 @@ void RenderImage::notifyFinished(CachedResource& newImage, const NetworkLoadMetr
contentChanged(ImageChanged);
}

if (is<HTMLImageElement>(element()))
page().didFinishLoadingImageForElement(downcast<HTMLImageElement>(*element()));
if (RefPtr image = dynamicDowncast<HTMLImageElement>(element()))
page().didFinishLoadingImageForElement(*image);

RenderReplaced::notifyFinished(newImage, metrics);
}
Expand Down Expand Up @@ -464,7 +464,8 @@ void RenderImage::paintIncompleteImageOutline(PaintInfo& paintInfo, LayoutPoint

static bool isDeferredImage(Element* element)
{
return is<HTMLImageElement>(element) && downcast<HTMLImageElement>(element)->isDeferred();
RefPtr image = dynamicDowncast<HTMLImageElement>(element);
return image && image->isDeferred();
}

void RenderImage::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOffset)
Expand Down Expand Up @@ -641,15 +642,11 @@ void RenderImage::paintAreaElementFocusRing(PaintInfo& paintInfo, const LayoutPo
if (paintInfo.context().paintingDisabled() && !paintInfo.context().performingPaintInvalidation())
return;

Element* focusedElement = document().focusedElement();
if (!is<HTMLAreaElement>(focusedElement))
RefPtr areaElement = dynamicDowncast<HTMLAreaElement>(document().focusedElement());
if (!areaElement || areaElement->imageElement() != element())
return;

HTMLAreaElement& areaElement = downcast<HTMLAreaElement>(*focusedElement);
if (areaElement.imageElement() != element())
return;

auto* areaElementStyle = areaElement.computedStyle();
auto* areaElementStyle = areaElement->computedStyle();
if (!areaElementStyle)
return;

Expand All @@ -659,7 +656,7 @@ void RenderImage::paintAreaElementFocusRing(PaintInfo& paintInfo, const LayoutPo

// Even if the theme handles focus ring drawing for entire elements, it won't do it for
// an area within an image, so we don't call RenderTheme::supportsFocusRing here.
auto path = areaElement.computePathForFocusRing(size());
auto path = areaElement->computePathForFocusRing(size());
if (path.isEmpty())
return;

Expand Down Expand Up @@ -702,10 +699,9 @@ ImageDrawResult RenderImage::paintIntoRect(PaintInfo& paintInfo, const FloatRect
auto* imageElement = dynamicDowncast<HTMLImageElement>(element());

// FIXME: Document when image != img.get().
Image* image = imageResource().image().get();

if (is<BitmapImage>(image))
downcast<BitmapImage>(*image).updateFromSettings(settings());
auto* image = imageResource().image().get();
if (RefPtr bitmapImage = dynamicDowncast<BitmapImage>(image))
bitmapImage->updateFromSettings(settings());

ImagePaintingOptions options = {
imageElement ? imageElement->compositeOperator() : CompositeOperator::SourceOver,
Expand Down Expand Up @@ -811,10 +807,10 @@ void RenderImage::updateAltText()
if (!element())
return;

if (is<HTMLInputElement>(*element()))
m_altText = downcast<HTMLInputElement>(*element()).altText();
else if (is<HTMLImageElement>(*element()))
m_altText = downcast<HTMLImageElement>(*element()).altText();
if (auto* input = dynamicDowncast<HTMLInputElement>(*element()))
m_altText = input->altText();
else if (auto* image = dynamicDowncast<HTMLImageElement>(*element()))
m_altText = image->altText();
}

bool RenderImage::canHaveChildren() const
Expand Down Expand Up @@ -879,10 +875,9 @@ void RenderImage::computeIntrinsicRatioInformation(FloatSize& intrinsicSize, Flo
// Our intrinsicSize is empty if we're rendering generated images with relative width/height. Figure out the right intrinsic size to use.
if (intrinsicSize.isEmpty() && (imageResource().imageHasRelativeWidth() || imageResource().imageHasRelativeHeight())) {
RenderObject* containingBlock = isOutOfFlowPositioned() ? container() : this->containingBlock();
if (is<RenderBox>(*containingBlock)) {
auto& box = downcast<RenderBox>(*containingBlock);
intrinsicSize.setWidth(box.availableLogicalWidth());
intrinsicSize.setHeight(box.availableLogicalHeight(IncludeMarginBorderPadding));
if (auto* box = dynamicDowncast<RenderBox>(*containingBlock)) {
intrinsicSize.setWidth(box->availableLogicalWidth());
intrinsicSize.setHeight(box->availableLogicalHeight(IncludeMarginBorderPadding));
}
}

Expand All @@ -905,10 +900,10 @@ bool RenderImage::needsPreferredWidthsRecalculation() const

RenderBox* RenderImage::embeddedContentBox() const
{
CachedImage* cachedImage = this->cachedImage();
if (cachedImage && is<SVGImage>(cachedImage->image()))
return downcast<SVGImage>(*cachedImage->image()).embeddedContentBox();

if (auto* cachedImage = this->cachedImage()) {
if (auto* image = dynamicDowncast<SVGImage>(cachedImage->image()))
return image->embeddedContentBox();
}
return nullptr;
}

Expand Down

0 comments on commit d4c1f69

Please sign in to comment.