Files
sousa-gecko/widget/NativeMenu.cpp
T
Emilio Cobos Álvarez dda671a2ab Bug 1977041 - Improve <img> tracking in cocoa native menu code. r=mac-reviewers,mstange
image attributes are easier to keep track of than styles, but our
handling of them is not quite ideal right now since what we really want
is the image's srcset (and that gets set from JS after the image
attribute mutation).

Differential Revision: https://phabricator.services.mozilla.com/D260126
2025-08-08 18:35:20 +00:00

54 lines
1.7 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "NativeMenu.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/HTMLImageElement.h"
#include "mozilla/dom/ResponsiveImageSelector.h"
#include "mozilla/ComputedStyle.h"
#include "nsComputedDOMStyle.h"
namespace mozilla::widget {
NativeMenuIcon NativeMenu::GetIcon(dom::Element& aElement) {
RefPtr img =
dom::HTMLImageElement::FromNodeOrNull(aElement.GetFirstElementChild());
if (!img) {
return {};
}
// We need the style for context paint, even if we end up using the image
// attribute.
RefPtr<const ComputedStyle> style = nsComputedDOMStyle::GetComputedStyle(img);
if (RefPtr uri = img->GetCurrentURI()) {
return {std::move(uri), std::move(style)};
}
// Try to take the selected image from the image selector. This works even if
// the image hasn't loaded yet (due to loading=lazy or such).
if (auto* selector = img->GetResponsiveImageSelector()) {
if (RefPtr uri = selector->GetSelectedImageURL()) {
return {std::move(uri), std::move(style)};
}
}
// Otherwise look for the icon's content property.
if (!style) {
return {};
}
auto items = style->StyleContent()->NonAltContentItems();
if (items.Length() != 1 || !items[0].IsImage()) {
return {};
}
const auto* url = items[0].AsImage().GetImageRequestURLValue();
if (!url) {
return {};
}
RefPtr uri = url->GetURI();
if (!uri) {
return {};
}
return {std::move(uri), std::move(style)};
}
} // namespace mozilla::widget