Skip to content

Commit

Permalink
Use dynamicDowncast<T> more in html/
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=265092

Reviewed by Jean-Yves Avenard.

Use dynamicDowncast<T> more in html/.

I did a little bit of smart pointer adoption on the lines I
changed too.

* Source/WebCore/html/BaseDateAndTimeInputType.cpp:
(WebCore::BaseDateAndTimeInputType::updateInnerTextValue):
* Source/WebCore/html/CachedHTMLCollectionInlines.h:
(WebCore::nameShouldBeVisibleInDocumentAll):
* Source/WebCore/html/CanvasBase.cpp:
(WebCore:: const):
* Source/WebCore/html/CustomPaintCanvas.cpp:
(WebCore::CustomPaintCanvas::getContext):
* Source/WebCore/html/DOMFormData.cpp:
(WebCore::createFileEntry):
* Source/WebCore/html/FTPDirectoryDocument.cpp:
(WebCore::FTPDirectoryDocumentParser::loadDocumentTemplate):
* Source/WebCore/html/FeaturePolicy.cpp:
(WebCore::isFeaturePolicyAllowedByDocumentAndAllOwners):
* Source/WebCore/html/FileInputType.cpp:
(isType):
* Source/WebCore/html/FormController.cpp:
(WebCore::shouldBeUsedForFormSignature):
* Source/WebCore/html/GenericCachedHTMLCollection.cpp:
(WebCore::GenericCachedHTMLCollection<traversalType>::elementMatches const):
* Source/WebCore/html/HTMLAnchorElement.cpp:
(WebCore::appendServerMapMousePosition):
(WebCore::HTMLAnchorElement::defaultEventHandler):
(WebCore::HTMLAnchorElement::eventType):
(WebCore::isEnterKeyKeydownEvent):
* Source/WebCore/html/HTMLAreaElement.cpp:
(WebCore::HTMLAreaElement::imageElement const):
(WebCore::HTMLAreaElement::setFocus):
* Source/WebCore/html/HTMLAttachmentElement.cpp:
(WebCore::HTMLAttachmentElement::enclosingImageElement const):
* Source/WebCore/html/HTMLAudioElement.h:
(isType):
* Source/WebCore/html/HTMLButtonElement.cpp:
(WebCore::HTMLButtonElement::defaultEventHandler):
* Source/WebCore/html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::getContext):
(WebCore::HTMLCanvasElement::didDraw):
(WebCore::HTMLCanvasElement::reset):
(WebCore::HTMLCanvasElement::getImageData):
(WebCore::HTMLCanvasElement::toVideoFrame):
(WebCore::HTMLCanvasElement::setImageBufferAndMarkDirty):
(WebCore::HTMLCanvasElement::clearImageBuffer const):
(WebCore::HTMLCanvasElement::virtualHasPendingActivity const):
* Source/WebCore/html/HTMLCanvasElement.h:
* Source/WebCore/html/HTMLCollection.cpp:
(WebCore::HTMLCollection::updateNamedElementCache const):
* Source/WebCore/html/HTMLDetailsElement.cpp:
(WebCore::DetailsSlotAssignment::slotNameForHostChild const):
* Source/WebCore/html/HTMLDocument.cpp:
(WebCore::HTMLDocument::namedItem):
* Source/WebCore/html/HTMLDocument.h:
(isType):
* Source/WebCore/html/HTMLElement.cpp:
(WebCore::elementAffectsDirectionality):
(WebCore::HTMLElement::editabilityFromContentEditableAttr):
(WebCore::HTMLElement::insertedIntoAncestor):
(WebCore::HTMLElement::setOuterText):
(WebCore::HTMLElement::computeDirectionalityFromText const):
(WebCore::HTMLElement::dirAttributeChanged):
(WebCore::HTMLElement::canBeActuallyDisabled const):
(WebCore::checkPopoverValidity):

Canonical link: https://commits.webkit.org/270960@main
  • Loading branch information
cdumez committed Nov 20, 2023
1 parent b8691e2 commit ac61808
Show file tree
Hide file tree
Showing 22 changed files with 161 additions and 144 deletions.
6 changes: 3 additions & 3 deletions Source/WebCore/html/BaseDateAndTimeInputType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -359,15 +359,15 @@ void BaseDateAndTimeInputType::updateInnerTextValue()
createShadowSubtreeIfNeeded();

if (!m_dateTimeEditElement) {
auto node = element()->userAgentShadowRoot()->firstChild();
if (!is<HTMLElement>(node))
RefPtr firstChildElement = dynamicDowncast<HTMLElement>(element()->userAgentShadowRoot()->firstChild());
if (!firstChildElement)
return;
auto displayValue = visibleValue();
if (displayValue.isEmpty()) {
// Need to put something to keep text baseline.
displayValue = " "_s;
}
downcast<HTMLElement>(*node).setInnerText(WTFMove(displayValue));
firstChildElement->setInnerText(WTFMove(displayValue));
return;
}

Expand Down
3 changes: 2 additions & 1 deletion Source/WebCore/html/CachedHTMLCollectionInlines.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ static inline bool nameShouldBeVisibleInDocumentAll(HTMLElement& element)

static inline bool nameShouldBeVisibleInDocumentAll(Element& element)
{
return is<HTMLElement>(element) && nameShouldBeVisibleInDocumentAll(downcast<HTMLElement>(element));
auto* htmlElement = dynamicDowncast<HTMLElement>(element);
return htmlElement && nameShouldBeVisibleInDocumentAll(*htmlElement);
}

template <typename HTMLCollectionClass, CollectionTraversalType traversalType>
Expand Down
5 changes: 3 additions & 2 deletions Source/WebCore/html/CanvasBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,10 +229,11 @@ HashSet<Element*> CanvasBase::cssCanvasClients() const
{
HashSet<Element*> cssCanvasClients;
for (auto& observer : m_observers) {
if (!is<StyleCanvasImage>(observer))
auto* image = dynamicDowncast<StyleCanvasImage>(observer);
if (!image)
continue;

for (auto entry : downcast<StyleCanvasImage>(observer).clients()) {
for (auto entry : image->clients()) {
auto& client = entry.key;
if (auto element = client.element())
cssCanvasClients.add(element);
Expand Down
7 changes: 4 additions & 3 deletions Source/WebCore/html/CustomPaintCanvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,10 @@ RefPtr<PaintRenderingContext2D> CustomPaintCanvas::getContext()
if (m_context)
return &downcast<PaintRenderingContext2D>(*m_context);

m_context = PaintRenderingContext2D::create(*this);

return &downcast<PaintRenderingContext2D>(*m_context);
auto context = PaintRenderingContext2D::create(*this);
auto* contextPtr = context.get();
m_context = WTFMove(context);
return contextPtr;
}

void CustomPaintCanvas::replayDisplayList(GraphicsContext& target)
Expand Down
13 changes: 6 additions & 7 deletions Source/WebCore/html/DOMFormData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,12 @@ static auto createFileEntry(const String& name, Blob& blob, const String& filena
{
auto usvName = replaceUnpairedSurrogatesWithReplacementCharacter(String(name));

if (!blob.isFile())
return { usvName, File::create(blob.scriptExecutionContext(), blob, filename.isNull() ? "blob"_s : filename) };

if (!filename.isNull())
return { usvName, File::create(blob.scriptExecutionContext(), downcast<File>(blob), filename) };

return { usvName, RefPtr<File> { &downcast<File>(blob) } };
if (RefPtr file = dynamicDowncast<File>(blob)) {
if (!filename.isNull())
return { usvName, File::create(blob.scriptExecutionContext(), *file, filename) };
return { usvName, WTFMove(file) };
}
return { usvName, File::create(blob.scriptExecutionContext(), blob, filename.isNull() ? "blob"_s : filename) };
}

void DOMFormData::append(const String& name, const String& value)
Expand Down
9 changes: 4 additions & 5 deletions Source/WebCore/html/FTPDirectoryDocument.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -304,12 +304,11 @@ bool FTPDirectoryDocumentParser::loadDocumentTemplate()
RefPtr foundElement = document.getElementById(StringView { "ftpDirectoryTable"_s });
if (!foundElement)
LOG_ERROR("Unable to find element by id \"ftpDirectoryTable\" in the template document.");
else if (!is<HTMLTableElement>(foundElement))
LOG_ERROR("Element of id \"ftpDirectoryTable\" is not a table element");
else {
m_tableElement = downcast<HTMLTableElement>(foundElement.get());
else if (RefPtr tableElement = dynamicDowncast<HTMLTableElement>(*foundElement)) {
m_tableElement = WTFMove(tableElement);
return true;
}
} else
LOG_ERROR("Element of id \"ftpDirectoryTable\" is not a table element");

m_tableElement = HTMLTableElement::create(document);
m_tableElement->setAttributeWithoutSynchronization(HTMLNames::idAttr, "ftpDirectoryTable"_s);
Expand Down
6 changes: 3 additions & 3 deletions Source/WebCore/html/FeaturePolicy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,11 +94,11 @@ bool isFeaturePolicyAllowedByDocumentAndAllOwners(FeaturePolicy::Type type, cons
}

auto* ownerElement = ancestorDocument->ownerElement();
if (is<HTMLIFrameElement>(ownerElement)) {
const auto& featurePolicy = downcast<HTMLIFrameElement>(ownerElement)->featurePolicy();
if (auto* iframe = dynamicDowncast<HTMLIFrameElement>(ownerElement)) {
const auto& featurePolicy = iframe->featurePolicy();
if (!featurePolicy.allows(type, ancestorDocument->securityOrigin().data())) {
if (logFailure == LogFeaturePolicyFailure::Yes && document.domWindow()) {
auto& allowValue = downcast<HTMLIFrameElement>(ownerElement)->attributeWithoutSynchronization(HTMLNames::allowAttr);
auto& allowValue = iframe->attributeWithoutSynchronization(HTMLNames::allowAttr);
document.domWindow()->printErrorMessage(makeString("Feature policy '", policyTypeName(type), "' check failed for iframe with origin '", document.securityOrigin().toString(), "' and allow attribute '", allowValue, "'."));
}
return false;
Expand Down
6 changes: 5 additions & 1 deletion Source/WebCore/html/FileInputType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,11 @@ class UploadButtonElement;

SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::UploadButtonElement)
static bool isType(const WebCore::Element& element) { return element.isUploadButton(); }
static bool isType(const WebCore::Node& node) { return is<WebCore::Element>(node) && isType(downcast<WebCore::Element>(node)); }
static bool isType(const WebCore::Node& node)
{
auto* element = dynamicDowncast<WebCore::Element>(node);
return element && isType(*element);
}
SPECIALIZE_TYPE_TRAITS_END()

namespace WebCore {
Expand Down
8 changes: 4 additions & 4 deletions Source/WebCore/html/FormController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,10 @@ class FormController::FormKeyGenerator {

static bool shouldBeUsedForFormSignature(const Element& element)
{
if (is<HTMLFormControlElement>(element))
return downcast<HTMLFormControlElement>(element).shouldSaveAndRestoreFormControlState();
if (is<HTMLMaybeFormAssociatedCustomElement>(element))
return downcast<HTMLMaybeFormAssociatedCustomElement>(element).hasFormAssociatedInterface() || element.isCustomElementUpgradeCandidate();
if (auto* formControl = dynamicDowncast<HTMLFormControlElement>(element))
return formControl->shouldSaveAndRestoreFormControlState();
if (auto* customElement = dynamicDowncast<HTMLMaybeFormAssociatedCustomElement>(element))
return customElement->hasFormAssociatedInterface() || element.isCustomElementUpgradeCandidate();
return false;
}

Expand Down
6 changes: 4 additions & 2 deletions Source/WebCore/html/GenericCachedHTMLCollection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,10 @@ bool GenericCachedHTMLCollection<traversalType>::elementMatches(Element& element
return element.hasTagName(tdTag) || element.hasTagName(thTag);
case CollectionType::TSectionRows:
return element.hasTagName(trTag);
case CollectionType::SelectedOptions:
return is<HTMLOptionElement>(element) && downcast<HTMLOptionElement>(element).selected();
case CollectionType::SelectedOptions: {
auto* optionElement = dynamicDowncast<HTMLOptionElement>(element);
return optionElement && optionElement->selected();
}
case CollectionType::DataListOptions:
return is<HTMLOptionElement>(element);
case CollectionType::MapAreas:
Expand Down
31 changes: 17 additions & 14 deletions Source/WebCore/html/HTMLAnchorElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,23 +159,23 @@ bool HTMLAnchorElement::isKeyboardFocusable(KeyboardEvent* event) const

static void appendServerMapMousePosition(StringBuilder& url, Event& event)
{
if (!is<MouseEvent>(event))
auto* mouseEvent = dynamicDowncast<MouseEvent>(event);
if (!mouseEvent)
return;
auto& mouseEvent = downcast<MouseEvent>(event);

if (!is<HTMLImageElement>(mouseEvent.target()))
auto* imageElement = dynamicDowncast<HTMLImageElement>(mouseEvent->target());
if (!imageElement)
return;

auto& imageElement = downcast<HTMLImageElement>(*mouseEvent.target());
if (!imageElement.isServerMap())
if (!imageElement->isServerMap())
return;

auto* renderer = imageElement.renderer();
if (!is<RenderImage>(renderer))
CheckedPtr renderer = dynamicDowncast<RenderImage>(imageElement->renderer());
if (!renderer)
return;

// FIXME: This should probably pass UseTransforms in the OptionSet<MapCoordinatesMode>.
auto absolutePosition = downcast<RenderImage>(*renderer).absoluteToLocal(FloatPoint(mouseEvent.pageX(), mouseEvent.pageY()));
auto absolutePosition = renderer->absoluteToLocal(FloatPoint(mouseEvent->pageX(), mouseEvent->pageY()));
url.append('?', std::lround(absolutePosition.x()), ',', std::lround(absolutePosition.y()));
}

Expand All @@ -197,9 +197,9 @@ void HTMLAnchorElement::defaultEventHandler(Event& event)
// This keeps track of the editable block that the selection was in (if it was in one) just before the link was clicked
// for the LiveWhenNotFocused editable link behavior
auto& eventNames = WebCore::eventNames();
if (event.type() == eventNames.mousedownEvent && is<MouseEvent>(event) && downcast<MouseEvent>(event).button() != MouseButton::Right && document().frame()) {
if (auto* mouseEvent = dynamicDowncast<MouseEvent>(event); event.type() == eventNames.mousedownEvent && mouseEvent && mouseEvent->button() != MouseButton::Right && document().frame()) {
setRootEditableElementForSelectionOnMouseDown(document().frame()->selection().selection().rootEditableElement());
m_wasShiftKeyDownOnMouseDown = downcast<MouseEvent>(event).shiftKey();
m_wasShiftKeyDownOnMouseDown = mouseEvent->shiftKey();
} else if (event.type() == eventNames.mouseoverEvent) {
// These are cleared on mouseover and not mouseout because their values are needed for drag events,
// but drag events happen after mouse out events.
Expand Down Expand Up @@ -664,9 +664,9 @@ AtomString HTMLAnchorElement::effectiveTarget() const

HTMLAnchorElement::EventType HTMLAnchorElement::eventType(Event& event)
{
if (!is<MouseEvent>(event))
return NonMouseEvent;
return downcast<MouseEvent>(event).shiftKey() ? MouseEventWithShiftKey : MouseEventWithoutShiftKey;
if (auto* mouseEvent = dynamicDowncast<MouseEvent>(event))
return mouseEvent->shiftKey() ? MouseEventWithShiftKey : MouseEventWithoutShiftKey;
return NonMouseEvent;
}

bool HTMLAnchorElement::treatLinkAsLiveForEventType(EventType eventType) const
Expand Down Expand Up @@ -697,7 +697,10 @@ bool HTMLAnchorElement::treatLinkAsLiveForEventType(EventType eventType) const

bool isEnterKeyKeydownEvent(Event& event)
{
return event.type() == eventNames().keydownEvent && is<KeyboardEvent>(event) && downcast<KeyboardEvent>(event).keyIdentifier() == "Enter"_s;
if (event.type() != eventNames().keydownEvent)
return false;
auto* keyboardEvent = dynamicDowncast<KeyboardEvent>(event);
return keyboardEvent && keyboardEvent->keyIdentifier() == "Enter"_s;
}

bool shouldProhibitLinks(Element* element)
Expand Down
15 changes: 5 additions & 10 deletions Source/WebCore/html/HTMLAreaElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -198,11 +198,9 @@ Path HTMLAreaElement::getRegion(const LayoutSize& size) const

RefPtr<HTMLImageElement> HTMLAreaElement::imageElement() const
{
RefPtr<Node> mapElement = parentNode();
if (!is<HTMLMapElement>(mapElement))
return nullptr;

return downcast<HTMLMapElement>(*mapElement).imageElement();
if (RefPtr mapElement = dynamicDowncast<HTMLMapElement>(parentNode()))
return mapElement->imageElement();
return nullptr;
}

bool HTMLAreaElement::isKeyboardFocusable(KeyboardEvent*) const
Expand Down Expand Up @@ -235,11 +233,8 @@ void HTMLAreaElement::setFocus(bool shouldBeFocused, FocusVisibility visibility)
if (!imageElement)
return;

auto* renderer = imageElement->renderer();
if (!is<RenderImage>(renderer))
return;

downcast<RenderImage>(*renderer).areaElementFocusChanged(this);
if (CheckedPtr renderer = dynamicDowncast<RenderImage>(imageElement->renderer()))
renderer->areaElementFocusChanged(this);
}

RefPtr<Element> HTMLAreaElement::focusAppearanceUpdateTarget()
Expand Down
5 changes: 1 addition & 4 deletions Source/WebCore/html/HTMLAttachmentElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -488,10 +488,7 @@ void HTMLAttachmentElement::setUniqueIdentifier(const String& uniqueIdentifier)

RefPtr<HTMLImageElement> HTMLAttachmentElement::enclosingImageElement() const
{
if (auto hostElement = shadowHost(); is<HTMLImageElement>(hostElement))
return downcast<HTMLImageElement>(hostElement);

return { };
return dynamicDowncast<HTMLImageElement>(shadowHost());
}

void HTMLAttachmentElement::attributeChanged(const QualifiedName& name, const AtomString& oldValue, const AtomString& newValue, AttributeModificationReason attributeModificationReason)
Expand Down
12 changes: 10 additions & 2 deletions Source/WebCore/html/HTMLAudioElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,16 @@ class HTMLAudioElement final : public HTMLMediaElement {

SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::HTMLAudioElement)
static bool isType(const WebCore::HTMLMediaElement& element) { return element.hasTagName(WebCore::HTMLNames::audioTag); }
static bool isType(const WebCore::Element& element) { return is<WebCore::HTMLMediaElement>(element) && isType(downcast<WebCore::HTMLMediaElement>(element)); }
static bool isType(const WebCore::Node& node) { return is<WebCore::HTMLMediaElement>(node) && isType(downcast<WebCore::HTMLMediaElement>(node)); }
static bool isType(const WebCore::Element& element)
{
auto* mediaElement = dynamicDowncast<WebCore::HTMLMediaElement>(element);
return mediaElement && isType(*mediaElement);
}
static bool isType(const WebCore::Node& node)
{
auto* mediaElement = dynamicDowncast<WebCore::HTMLMediaElement>(node);
return mediaElement && isType(*mediaElement);
}
SPECIALIZE_TYPE_TRAITS_END()

#endif // ENABLE(VIDEO)
21 changes: 10 additions & 11 deletions Source/WebCore/html/HTMLButtonElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,29 +159,28 @@ void HTMLButtonElement::defaultEventHandler(Event& event)
handlePopoverTargetAction();
}

if (is<KeyboardEvent>(event)) {
KeyboardEvent& keyboardEvent = downcast<KeyboardEvent>(event);
if (keyboardEvent.type() == eventNames.keydownEvent && keyboardEvent.keyIdentifier() == "U+0020"_s) {
if (RefPtr keyboardEvent = dynamicDowncast<KeyboardEvent>(event)) {
if (keyboardEvent->type() == eventNames.keydownEvent && keyboardEvent->keyIdentifier() == "U+0020"_s) {
setActive(true);
// No setDefaultHandled() - IE dispatches a keypress in this case.
return;
}
if (keyboardEvent.type() == eventNames.keypressEvent) {
switch (keyboardEvent.charCode()) {
if (keyboardEvent->type() == eventNames.keypressEvent) {
switch (keyboardEvent->charCode()) {
case '\r':
dispatchSimulatedClick(&keyboardEvent);
keyboardEvent.setDefaultHandled();
dispatchSimulatedClick(keyboardEvent.get());
keyboardEvent->setDefaultHandled();
return;
case ' ':
// Prevent scrolling down the page.
keyboardEvent.setDefaultHandled();
keyboardEvent->setDefaultHandled();
return;
}
}
if (keyboardEvent.type() == eventNames.keyupEvent && keyboardEvent.keyIdentifier() == "U+0020"_s) {
if (keyboardEvent->type() == eventNames.keyupEvent && keyboardEvent->keyIdentifier() == "U+0020"_s) {
if (active())
dispatchSimulatedClick(&keyboardEvent);
keyboardEvent.setDefaultHandled();
dispatchSimulatedClick(keyboardEvent.get());
keyboardEvent->setDefaultHandled();
return;
}
}
Expand Down
Loading

0 comments on commit ac61808

Please sign in to comment.