Skip to content

Commit

Permalink
Avoid allocating ElementRareData for IntersectionObserverData with HT…
Browse files Browse the repository at this point in the history
…MLImageElement

https://bugs.webkit.org/show_bug.cgi?id=270724

Reviewed by Yusuke Suzuki.

Inline IntersectionObserverData in HTMLImageElement to avoid creating ElementRareData
whenever loading=lazy is used.

* Source/WebCore/dom/Element.cpp:
(WebCore::Element::~Element):
(WebCore::Element::ensureIntersectionObserverData):
* Source/WebCore/dom/Element.h:
* Source/WebCore/html/HTMLImageElement.cpp:
(WebCore::HTMLImageElement::~HTMLImageElement):
(WebCore::HTMLImageElement::ensureIntersectionObserverData):
(WebCore::HTMLImageElement::intersectionObserverDataIfExists):
* Source/WebCore/html/HTMLImageElement.h:

Canonical link: https://commits.webkit.org/275954@main
  • Loading branch information
rniwa committed Mar 12, 2024
1 parent 9b04524 commit 1468afa
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 4 deletions.
3 changes: 3 additions & 0 deletions Source/WebCore/dom/Element.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
#include "HTMLDialogElement.h"
#include "HTMLDocument.h"
#include "HTMLHtmlElement.h"
#include "HTMLImageElement.h"
#include "HTMLInputElement.h"
#include "HTMLLabelElement.h"
#include "HTMLNameCollection.h"
Expand Down Expand Up @@ -261,6 +262,7 @@ Element::~Element()
ASSERT(!afterPseudoElement());

elementIdentifiersMap().remove(*this);
ASSERT(!is<HTMLImageElement>(*this) || !intersectionObserverDataIfExists());
disconnectFromIntersectionObservers();

disconnectFromResizeObservers();
Expand Down Expand Up @@ -4523,6 +4525,7 @@ void Element::disconnectFromIntersectionObserversSlow(IntersectionObserverData&

IntersectionObserverData& Element::ensureIntersectionObserverData()
{
ASSERT(!is<HTMLImageElement>(*this));
auto& rareData = ensureElementRareData();
if (!rareData.intersectionObserverData())
rareData.setIntersectionObserverData(makeUnique<IntersectionObserverData>());
Expand Down
6 changes: 3 additions & 3 deletions Source/WebCore/dom/Element.h
Original file line number Diff line number Diff line change
Expand Up @@ -731,8 +731,8 @@ class Element : public ContainerNode {
using ContainerNode::setAttributeEventListener;
void setAttributeEventListener(const AtomString& eventType, const QualifiedName& attributeName, const AtomString& value);

IntersectionObserverData& ensureIntersectionObserverData();
IntersectionObserverData* intersectionObserverDataIfExists();
virtual IntersectionObserverData& ensureIntersectionObserverData();
virtual IntersectionObserverData* intersectionObserverDataIfExists();

ResizeObserverData& ensureResizeObserverData();
ResizeObserverData* resizeObserverDataIfExists();
Expand Down Expand Up @@ -798,6 +798,7 @@ class Element : public ContainerNode {
FormAssociatedCustomElement& formAssociatedCustomElementUnsafe() const;
void ensureFormAssociatedCustomElement();

void disconnectFromIntersectionObservers();
static AtomString makeTargetBlankIfHasDanglingMarkup(const AtomString& target);

private:
Expand Down Expand Up @@ -857,7 +858,6 @@ class Element : public ContainerNode {
LayoutRect absoluteEventBounds(bool& boundsIncludeAllDescendantElements, bool& includesFixedPositionElements);
LayoutRect absoluteEventBoundsOfElementAndDescendants(bool& includesFixedPositionElements);

void disconnectFromIntersectionObservers();
void disconnectFromIntersectionObserversSlow(IntersectionObserverData&);

void disconnectFromResizeObservers();
Expand Down
13 changes: 13 additions & 0 deletions Source/WebCore/html/HTMLImageElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ Ref<HTMLImageElement> HTMLImageElement::create(const QualifiedName& tagName, Doc

HTMLImageElement::~HTMLImageElement()
{
disconnectFromIntersectionObservers();
document().removeDynamicMediaQueryDependentImage(*this);
setForm(nullptr);
#if ENABLE(ACCESSIBILITY_ANIMATION_CONTROL)
Expand Down Expand Up @@ -1114,4 +1115,16 @@ bool HTMLImageElement::originClean(const SecurityOrigin& origin) const
return true;
}

IntersectionObserverData& HTMLImageElement::ensureIntersectionObserverData()
{
if (!m_intersectionObserverData)
m_intersectionObserverData = makeUnique<IntersectionObserverData>();
return *m_intersectionObserverData;
}

IntersectionObserverData* HTMLImageElement::intersectionObserverDataIfExists()
{
return m_intersectionObserverData.get();
}

}
6 changes: 5 additions & 1 deletion Source/WebCore/html/HTMLImageElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -259,13 +259,17 @@ class HTMLImageElement
HTMLSourceElement* sourceElement() const;
void setSourceElement(HTMLSourceElement*);

IntersectionObserverData& ensureIntersectionObserverData() final;
IntersectionObserverData* intersectionObserverDataIfExists() final;

std::unique_ptr<HTMLImageLoader> m_imageLoader;
std::unique_ptr<IntersectionObserverData> m_intersectionObserverData;

CompositeOperator m_compositeOperator;
AtomString m_bestFitImageURL;
URL m_currentURL;
AtomString m_currentSrc;
AtomString m_parsedUsemap;
CompositeOperator m_compositeOperator;
float m_imageDevicePixelRatio;
#if ENABLE(SERVICE_CONTROLS)
bool m_isImageMenuEnabled { false };
Expand Down

0 comments on commit 1468afa

Please sign in to comment.