Skip to content

Commit

Permalink
Adopt more smart pointers in ImageControlsMac.cpp
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=267860

Reviewed by Brent Fulgham.

* Source/WebCore/dom/Document.h:
(WebCore::Document::checkedEventLoop):
* Source/WebCore/dom/mac/ImageControlsMac.cpp:
(WebCore::ImageControlsMac::hasImageControls):
(WebCore::ImageControlsMac::isImageControlsButtonElement):
(WebCore::ImageControlsMac::isInsideImageControls):
(WebCore::ImageControlsMac::createImageControls):
(WebCore::ImageControlsMac::handleEvent):
(WebCore::ImageControlsMac::updateImageControls):
(WebCore::ImageControlsMac::destroyImageControls):
* Source/WebCore/dom/mac/ImageControlsMac.h:

Canonical link: https://commits.webkit.org/273308@main
  • Loading branch information
cdumez committed Jan 22, 2024
1 parent a7d81ce commit fcb6926
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 27 deletions.
1 change: 1 addition & 0 deletions Source/WebCore/dom/Document.h
Original file line number Diff line number Diff line change
Expand Up @@ -1245,6 +1245,7 @@ class Document
WEBCORE_EXPORT void postTask(Task&&) final; // Executes the task on context's thread asynchronously.

WEBCORE_EXPORT EventLoopTaskGroup& eventLoop() final;
CheckedRef<EventLoopTaskGroup> checkedEventLoop() { return eventLoop(); }
WindowEventLoop& windowEventLoop();

ScriptedAnimationController* scriptedAnimationController() { return m_scriptedAnimationController.get(); }
Expand Down
43 changes: 17 additions & 26 deletions Source/WebCore/dom/mac/ImageControlsMac.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ static const AtomString& imageControlsButtonIdentifier()

bool hasImageControls(const HTMLElement& element)
{
auto shadowRoot = element.shadowRoot();
RefPtr shadowRoot = element.shadowRoot();
if (!shadowRoot || shadowRoot->mode() != ShadowRootMode::UserAgent)
return false;

Expand All @@ -86,22 +86,14 @@ static RefPtr<HTMLElement> imageControlsHost(const Node& node)
return hasImageControls(*host) ? host : nullptr;
}

bool isImageControlsButtonElement(const Node& node)
bool isImageControlsButtonElement(const Element& element)
{
auto host = imageControlsHost(node);
if (!host)
return false;

auto* element = dynamicDowncast<Element>(node);
if (!element)
return false;

return element->getIdAttribute() == imageControlsButtonIdentifier();
return imageControlsHost(element) && element.getIdAttribute() == imageControlsButtonIdentifier();
}

bool isInsideImageControls(const Node& node)
{
auto host = imageControlsHost(node);
RefPtr host = imageControlsHost(node);
if (!host)
return false;

Expand All @@ -112,17 +104,17 @@ void createImageControls(HTMLElement& element)
{
Ref document = element.document();
Ref shadowRoot = element.ensureUserAgentShadowRoot();
auto controlLayer = HTMLDivElement::create(document.get());
Ref controlLayer = HTMLDivElement::create(document.get());
controlLayer->setIdAttribute(imageControlsElementIdentifier());
controlLayer->setAttributeWithoutSynchronization(HTMLNames::contenteditableAttr, falseAtom());
shadowRoot->appendChild(controlLayer);

static MainThreadNeverDestroyed<const String> shadowStyle(StringImpl::createWithoutCopying(imageControlsMacUserAgentStyleSheet, sizeof(imageControlsMacUserAgentStyleSheet)));
auto style = HTMLStyleElement::create(HTMLNames::styleTag, document.get(), false);
Ref style = HTMLStyleElement::create(HTMLNames::styleTag, document.get(), false);
style->setTextContent(String { shadowStyle });
shadowRoot->appendChild(WTFMove(style));

auto button = HTMLButtonElement::create(HTMLNames::buttonTag, element.document(), nullptr);
Ref button = HTMLButtonElement::create(HTMLNames::buttonTag, element.document(), nullptr);
button->setIdAttribute(imageControlsButtonIdentifier());
controlLayer->appendChild(button);
controlLayer->setUserAgentPart(UserAgentParts::appleAttachmentControlsContainer());
Expand Down Expand Up @@ -159,13 +151,12 @@ bool handleEvent(HTMLElement& element, Event& event)
if (!mouseEvent)
return false;

RefPtr node = dynamicDowncast<Node>(mouseEvent->target());
if (!node)
RefPtr target = dynamicDowncast<Element>(mouseEvent->target());
if (!target)
return false;

if (ImageControlsMac::isImageControlsButtonElement(*node)) {
Ref element = downcast<Element>(node.releaseNonNull());
auto* renderer = element->renderer();
if (ImageControlsMac::isImageControlsButtonElement(*target)) {
CheckedPtr renderer = target->renderer();
if (!renderer)
return false;

Expand All @@ -175,12 +166,12 @@ bool handleEvent(HTMLElement& element, Event& event)

auto point = view->contentsToWindow(renderer->absoluteBoundingBoxRect()).minXMaxYCorner();

if (RefPtr shadowHost = dynamicDowncast<HTMLImageElement>(element->shadowHost())) {
if (RefPtr shadowHost = dynamicDowncast<HTMLImageElement>(target->shadowHost())) {
RefPtr image = imageFromImageElementNode(*shadowHost);
if (!image)
return false;
page->chrome().client().handleImageServiceClick(point, *image, *shadowHost);
} else if (RefPtr shadowHost = dynamicDowncast<HTMLAttachmentElement>(element->shadowHost()))
} else if (RefPtr shadowHost = dynamicDowncast<HTMLAttachmentElement>(target->shadowHost()))
page->chrome().client().handlePDFServiceClick(point, *shadowHost);

event.setDefaultHandled();
Expand Down Expand Up @@ -209,7 +200,7 @@ void updateImageControls(HTMLElement& element)
if (!element.document().settings().imageControlsEnabled())
return;

element.document().eventLoop().queueTask(TaskSource::InternalAsyncTask, [weakElement = WeakPtr { element }] {
element.protectedDocument()->checkedEventLoop()->queueTask(TaskSource::InternalAsyncTask, [weakElement = WeakPtr { element }] {
RefPtr protectedElement = weakElement.get();
if (!protectedElement)
return;
Expand All @@ -232,7 +223,7 @@ void tryCreateImageControls(HTMLElement& element)

void destroyImageControls(HTMLElement& element)
{
auto shadowRoot = element.userAgentShadowRoot();
RefPtr shadowRoot = element.userAgentShadowRoot();
if (!shadowRoot)
return;

Expand All @@ -248,9 +239,9 @@ void destroyImageControls(HTMLElement& element)
if (!renderObject)
return;

if (auto* renderImage = dynamicDowncast<RenderImage>(*renderObject))
if (CheckedPtr renderImage = dynamicDowncast<RenderImage>(*renderObject))
renderImage->setHasShadowControls(false);
else if (auto* renderAttachment = dynamicDowncast<RenderAttachment>(*renderObject))
else if (CheckedPtr renderAttachment = dynamicDowncast<RenderAttachment>(*renderObject))
renderAttachment->setHasShadowControls(false);
}

Expand Down
3 changes: 2 additions & 1 deletion Source/WebCore/dom/mac/ImageControlsMac.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

namespace WebCore {

class Element;
class Event;
class HTMLElement;
class Node;
Expand All @@ -37,7 +38,7 @@ namespace ImageControlsMac {

#if ENABLE(SERVICE_CONTROLS)

bool isImageControlsButtonElement(const Node&);
bool isImageControlsButtonElement(const Element&);
bool isInsideImageControls(const Node&);
void createImageControls(HTMLElement&);
bool handleEvent(HTMLElement&, Event&);
Expand Down

0 comments on commit fcb6926

Please sign in to comment.