WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
Bug 233970
Show correct content menu for images services chevron.
https://bugs.webkit.org/show_bug.cgi?id=233970
Summary
Show correct content menu for images services chevron.
Megan Gardner
Reported
2021-12-07 20:19:47 PST
Show correct content menu for images services chevron.
Attachments
Patch
(23.83 KB, patch)
2021-12-07 20:34 PST
,
Megan Gardner
no flags
Details
Formatted Diff
Diff
Patch
(23.88 KB, patch)
2021-12-08 14:52 PST
,
Megan Gardner
no flags
Details
Formatted Diff
Diff
Patch
(23.88 KB, patch)
2021-12-08 16:09 PST
,
Megan Gardner
no flags
Details
Formatted Diff
Diff
Patch for landing
(23.93 KB, patch)
2021-12-08 18:37 PST
,
Megan Gardner
no flags
Details
Formatted Diff
Diff
Patch for landing
(23.92 KB, patch)
2021-12-08 18:39 PST
,
Megan Gardner
no flags
Details
Formatted Diff
Diff
Patch for landing
(23.92 KB, patch)
2021-12-08 20:30 PST
,
Megan Gardner
no flags
Details
Formatted Diff
Diff
Patch for landing
(25.92 KB, patch)
2021-12-08 20:47 PST
,
Megan Gardner
no flags
Details
Formatted Diff
Diff
Patch for landing
(23.83 KB, patch)
2021-12-08 20:51 PST
,
Megan Gardner
no flags
Details
Formatted Diff
Diff
Show Obsolete
(7)
View All
Add attachment
proposed patch, testcase, etc.
Megan Gardner
Comment 1
2021-12-07 20:34:24 PST
Created
attachment 446284
[details]
Patch
Tim Horton
Comment 2
2021-12-07 21:04:28 PST
Comment on
attachment 446284
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=446284&action=review
> Source/WebCore/ChangeLog:8 > + Add support for showing the correct content menu for image service.
"context" "services"
> Source/WebCore/ChangeLog:11 > + Since this is internal only and can never be affected by web content, we bypass > + the web content round trip and directly message the UIProcess about showing > + a context menu for images.
Also because it would be bizarre if the web content could prevent a menu from popping up on a button they have no control over. (instead perhaps a way to prevent the button, but not *just* the menu)
> Source/WebCore/dom/mac/ImageControlsMac.cpp:141 > + auto result = frame->eventHandler().hitTestResultAtPoint(mouseEvent.absoluteLocation(), hitType);
The event was already routed to the button by a hit test so it seems odd that you're doing *another* (and just to escape the shadow?). Wouldn't it be much simpler and more efficient to just check if your passed-in <button> is inside the image controls shadow DOM (I assume that is doable somehow by walking upwards?) and popping up to the image element that way? Mostly I'm just saying... this seems a bit roundabout. ALSO, you're doing this hit test for every click on every <button>; surely if the thing I said above is too hard, there is some other way to short-cut it in the 99(.999999)% case where it's not an image controls button?)
> Source/WebKit/Shared/ContextMenuContextData.cpp:54 > + , m_webHitTestResultData(WebHitTestResultData(context.hitTestResult(), true))
Likely could also have just been `m_webHitTestResultData({ context.hitTestResult(), true })`
> Source/WebKit/Shared/ContextMenuContextData.cpp:78 > +bool ContextMenuContextData::setImage(WebCore::Image* image)
Everybody ignores this return value, what's it for?
> Source/WebKit/Shared/ContextMenuContextData.h:96 > + > + bool setImage(WebCore::Image*);
This is clearly misplaced, put it before the members.
> Source/WebKit/UIProcess/WebContextMenuProxy.cpp:58 > + auto hitTestDataOptional = m_context.webHitTestResultData(); > + if (!hitTestDataOptional) > + return;
Perhaps this should just be an assertion? I think we expect it's always engaged if you get here?
> Source/WebKit/UIProcess/WebPageProxy.cpp:6906 > + auto hitTestDataOptional = m_activeContextMenuContextData.webHitTestResultData();
We don't usually "optional" suffix optionals. hitTestData is fine. Also I think again this could just be an assertion, and you could stash the optional in a reference at the top of the function and keep using that
> Source/WebKit/UIProcess/mac/WebContextMenuProxyMac.mm:312 > + auto hitTestDataOptional = m_context.webHitTestResultData();
Apply previous comments to the rest of these files
Megan Gardner
Comment 3
2021-12-08 14:52:20 PST
Created
attachment 446427
[details]
Patch
Wenson Hsieh
Comment 4
2021-12-08 15:47:07 PST
Comment on
attachment 446427
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=446427&action=review
> Source/WebCore/dom/mac/ImageControlsMac.cpp:72 > + return downcast<HTMLElement>(node).getIdAttribute() == imageControlsButtonIdentifier();
I might be missing something, but are we guaranteed that `node` is an `HTMLElement` here? If not, this could cause type confusion. I think it would be safer to do: ``` bool isImageControlsButtonElement(const Node& node) { return is<Element>(node) && downcast<Element>(node).getIdAttribute() == imageControlsButtonIdentifier(); } ```
Wenson Hsieh
Comment 5
2021-12-08 15:49:14 PST
Comment on
attachment 446427
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=446427&action=review
> Source/WebCore/dom/mac/ImageControlsMac.cpp:120 > + return nullptr;
(Also, this should be `return false;`)
Chris Dumez
Comment 6
2021-12-08 15:53:22 PST
Comment on
attachment 446427
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=446427&action=review
> Source/WebCore/dom/mac/ImageControlsMac.cpp:109 > + if (event.type() == eventNames().clickEvent) {
I'd suggest using != and doing an early return to reduce scoping in this function.
> Source/WebCore/dom/mac/ImageControlsMac.cpp:110 > + RefPtr<Frame> frame = element.document().frame();
RefPtr frame = element.document().frame();
> Source/WebCore/dom/mac/ImageControlsMac.cpp:118 > + auto& mouseEvent = downcast<MouseEvent>(event);
This doesn't look safe. What guarantees that this is a MouseEvent? The JS can construct events with any name (e.g. new CustomEvent("click")).
Megan Gardner
Comment 7
2021-12-08 16:09:50 PST
Created
attachment 446450
[details]
Patch
Megan Gardner
Comment 8
2021-12-08 18:37:00 PST
Created
attachment 446478
[details]
Patch for landing
EWS
Comment 9
2021-12-08 18:38:12 PST
ChangeLog entry in Source/WebCore/ChangeLog contains OOPS!.
Megan Gardner
Comment 10
2021-12-08 18:39:34 PST
Created
attachment 446479
[details]
Patch for landing
Darin Adler
Comment 11
2021-12-08 18:41:49 PST
Comment on
attachment 446450
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=446450&action=review
> Source/WebKit/Shared/ContextMenuContextData.h:55 > + std::optional<WebHitTestResultData> webHitTestResultData() { return m_webHitTestResultData; } > + const std::optional<WebHitTestResultData> webHitTestResultData() const { return m_webHitTestResultData; }
This doesn’t make sense. What’s const here is the std::optional. Consider this analogous case: int size() { ... } const int size() const { ... } All the second overload does is return a value you can’t overwrite with assignment, almost no effect at all. Since this returns a copy, we only need one function: std::optional<WebHitTestResultData> webHitTestResultData() const { return m_webHitTestResultData; } Or if we don’t want to do as much copying: const std::optional<WebHitTestResultData>& webHitTestResultData() const { return m_webHitTestResultData; } Or we could return a reference like the code did before, and have two functions. std::optional<WebHitTestResultData>& webHitTestResultData() { return m_webHitTestResultData; } const std::optional<WebHitTestResultData>& webHitTestResultData() const { return m_webHitTestResultData; } The latter is worth doing if we want to be able to modify the webHitTestResultData().
Megan Gardner
Comment 12
2021-12-08 20:30:05 PST
Created
attachment 446495
[details]
Patch for landing
Megan Gardner
Comment 13
2021-12-08 20:47:46 PST
Created
attachment 446497
[details]
Patch for landing
Megan Gardner
Comment 14
2021-12-08 20:51:18 PST
Created
attachment 446499
[details]
Patch for landing
EWS
Comment 15
2021-12-08 21:28:14 PST
Committed
r286762
(
245003@main
): <
https://commits.webkit.org/245003@main
> All reviewed patches have been landed. Closing bug and clearing flags on
attachment 446499
[details]
.
Radar WebKit Bug Importer
Comment 16
2021-12-08 21:29:22 PST
<
rdar://problem/86252061
>
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug