Skip to content

Commit

Permalink
AX: WebPageProxy::bindRemoteAccessibilityFrames synchronously returns…
Browse files Browse the repository at this point in the history
… a std::span<uint8_t>, which is not safe

https://bugs.webkit.org/show_bug.cgi?id=273720
rdar://problem/125160477

Reviewed by Chris Fleizach.

Return a Vector<uint8_t> instead, which is safe.

This patch also adds a missing completion handler to WebRemoteFrameClient::bindRemoteAccessibilityFrames. Presumably
without this completionHandler call, the sender would wait forever for a response that never comes.

* Source/WebCore/accessibility/AccessibilityScrollView.cpp:
(WebCore::AccessibilityScrollView::addRemoteFrameChild):
* Source/WebCore/page/RemoteFrame.cpp:
(WebCore::RemoteFrame::bindRemoteAccessibilityFrames):
* Source/WebCore/page/RemoteFrame.h:
* Source/WebCore/page/RemoteFrameClient.h:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::bindRemoteAccessibilityFrames):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebPageProxy.messages.in:
* Source/WebKit/WebProcess/WebCoreSupport/WebRemoteFrameClient.cpp:
(WebKit::WebRemoteFrameClient::bindRemoteAccessibilityFrames):
* Source/WebKit/WebProcess/WebCoreSupport/WebRemoteFrameClient.h:
* Source/WebKit/WebProcess/WebPage/Cocoa/WebPageCocoa.mm:
(WebKit::WebPage::bindRemoteAccessibilityFrames):
* Source/WebKit/WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::bindRemoteAccessibilityFrames):
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Source/WebKit/WebProcess/WebPage/WebPage.messages.in:

Canonical link: https://commits.webkit.org/278507@main
  • Loading branch information
twilco committed May 8, 2024
1 parent 1c70b1e commit a3d84e2
Show file tree
Hide file tree
Showing 13 changed files with 25 additions and 25 deletions.
9 changes: 4 additions & 5 deletions Source/WebCore/accessibility/AccessibilityScrollView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -222,14 +222,13 @@ void AccessibilityScrollView::addRemoteFrameChild()

#if PLATFORM(MAC)
// Generate a new token and pass it back to the other remote frame so it can bind these objects together.
auto generatedToken = m_remoteFrame->generateRemoteToken();
auto& remoteFrame = remoteFrameView->frame();
remoteFrame.bindRemoteAccessibilityFrames(getpid(), generatedToken, [this, &remoteFrame, protectedAccessbilityRemoteFrame = RefPtr { m_remoteFrame }] (std::span<const uint8_t> token, int processIdentifier) mutable {
protectedAccessbilityRemoteFrame->initializePlatformElementWithRemoteToken(token, processIdentifier);
Ref remoteFrame = remoteFrameView->frame();
remoteFrame->bindRemoteAccessibilityFrames(getpid(), { m_remoteFrame->generateRemoteToken() }, [this, &remoteFrame, protectedAccessbilityRemoteFrame = RefPtr { m_remoteFrame }] (Vector<uint8_t> token, int processIdentifier) mutable {
protectedAccessbilityRemoteFrame->initializePlatformElementWithRemoteToken(token.span(), processIdentifier);

// Update the remote side with the offset of this object so it can calculate frames correctly.
auto location = elementRect().location();
remoteFrame.updateRemoteFrameAccessibilityOffset(flooredIntPoint(location));
remoteFrame->updateRemoteFrameAccessibilityOffset(flooredIntPoint(location));
});
#endif
} else
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/page/RemoteFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,9 @@ void RemoteFrame::unbindRemoteAccessibilityFrames(int processIdentifier)
m_client->unbindRemoteAccessibilityFrames(processIdentifier);
}

void RemoteFrame::bindRemoteAccessibilityFrames(int processIdentifier, std::span<const uint8_t> dataToken, CompletionHandler<void(std::span<const uint8_t>, int)>&& completionHandler)
void RemoteFrame::bindRemoteAccessibilityFrames(int processIdentifier, Vector<uint8_t>&& dataToken, CompletionHandler<void(Vector<uint8_t>, int)>&& completionHandler)
{
return m_client->bindRemoteAccessibilityFrames(processIdentifier, frameID(), dataToken, WTFMove(completionHandler));
return m_client->bindRemoteAccessibilityFrames(processIdentifier, frameID(), WTFMove(dataToken), WTFMove(completionHandler));
}

FrameView* RemoteFrame::virtualView() const
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/page/RemoteFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class RemoteFrame final : public Frame {
Markable<LayerHostingContextIdentifier> layerHostingContextIdentifier() const { return m_layerHostingContextIdentifier; }

String renderTreeAsText(size_t baseIndent, OptionSet<RenderAsTextFlag>);
void bindRemoteAccessibilityFrames(int processIdentifier, std::span<const uint8_t>, CompletionHandler<void(std::span<const uint8_t>, int)>&&);
void bindRemoteAccessibilityFrames(int processIdentifier, Vector<uint8_t>&&, CompletionHandler<void(Vector<uint8_t>, int)>&&);
void updateRemoteFrameAccessibilityOffset(IntPoint);
void unbindRemoteAccessibilityFrames(int);

Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/page/RemoteFrameClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class RemoteFrameClient : public FrameLoaderClient {
virtual void changeLocation(FrameLoadRequest&&) = 0;
virtual String renderTreeAsText(size_t baseIndent, OptionSet<RenderAsTextFlag>) = 0;
virtual void closePage() = 0;
virtual void bindRemoteAccessibilityFrames(int processIdentifier, FrameIdentifier target, std::span<const uint8_t> dataToken, CompletionHandler<void(std::span<const uint8_t>, int)>&&) = 0;
virtual void bindRemoteAccessibilityFrames(int processIdentifier, FrameIdentifier target, Vector<uint8_t>&& dataToken, CompletionHandler<void(Vector<uint8_t>, int)>&&) = 0;
virtual void updateRemoteFrameAccessibilityOffset(FrameIdentifier target, IntPoint) = 0;
virtual void unbindRemoteAccessibilityFrames(int) = 0;
virtual void focus() = 0;
Expand Down
5 changes: 2 additions & 3 deletions Source/WebKit/UIProcess/WebPageProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14050,14 +14050,13 @@ void WebPageProxy::sendScrollPositionChangedForNode(std::optional<WebCore::Frame
}
#endif

void WebPageProxy::bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier frameID, std::span<const uint8_t> dataToken, CompletionHandler<void(std::span<const uint8_t>, int)>&& completionHandler)
void WebPageProxy::bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier frameID, Vector<uint8_t>&& dataToken, CompletionHandler<void(Vector<uint8_t>, int)>&& completionHandler)
{
auto sendResult = sendSyncToProcessContainingFrame(frameID, Messages::WebPage::BindRemoteAccessibilityFrames(processIdentifier, frameID, dataToken));
auto sendResult = sendSyncToProcessContainingFrame(frameID, Messages::WebPage::BindRemoteAccessibilityFrames(processIdentifier, frameID, WTFMove(dataToken)));
if (!sendResult.succeeded())
return completionHandler({ }, 0);

auto [frameDataToken, frameProcessIdentifier] = sendResult.takeReply();

completionHandler(frameDataToken, frameProcessIdentifier);
}

Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/UIProcess/WebPageProxy.h
Original file line number Diff line number Diff line change
Expand Up @@ -3042,7 +3042,7 @@ class WebPageProxy final : public API::ObjectImpl<API::Object::Type::Page>, publ
void postMessageToRemote(WebCore::FrameIdentifier source, const String& sourceOrigin, WebCore::FrameIdentifier target, std::optional<WebCore::SecurityOriginData> targetOrigin, const WebCore::MessageWithMessagePorts&);
void renderTreeAsTextForTesting(WebCore::FrameIdentifier, size_t baseIndent, OptionSet<WebCore::RenderAsTextFlag>, CompletionHandler<void(String&&)>&&);
void frameTextForTesting(WebCore::FrameIdentifier, CompletionHandler<void(String&&)>&&);
void bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier, std::span<const uint8_t> dataToken, CompletionHandler<void(std::span<const uint8_t>, int)>&&);
void bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier, Vector<uint8_t>&& dataToken, CompletionHandler<void(Vector<uint8_t>, int)>&&);
void updateRemoteFrameAccessibilityOffset(WebCore::FrameIdentifier, WebCore::IntPoint);
void documentURLForConsoleLog(WebCore::FrameIdentifier, CompletionHandler<void(const URL&)>&&);

Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/UIProcess/WebPageProxy.messages.in
Original file line number Diff line number Diff line change
Expand Up @@ -637,7 +637,7 @@ messages -> WebPageProxy {
PostMessageToRemote(WebCore::FrameIdentifier source, String sourceOrigin, WebCore::FrameIdentifier target, std::optional<WebCore::SecurityOriginData> targetOrigin, struct WebCore::MessageWithMessagePorts message)
RenderTreeAsTextForTesting(WebCore::FrameIdentifier identifier, size_t baseIndent, OptionSet<WebCore::RenderAsTextFlag> behavior) -> (String renderTreeDump) Synchronous
FrameTextForTesting(WebCore::FrameIdentifier frameID) -> (String text) Synchronous
BindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier frameID, std::span<const uint8_t> dataToken) -> (std::span<const uint8_t> token, int processIdentifier) Synchronous
BindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier frameID, Vector<uint8_t> dataToken) -> (Vector<uint8_t> token, int processIdentifier) Synchronous
UpdateRemoteFrameAccessibilityOffset(WebCore::FrameIdentifier frameID, WebCore::IntPoint offset)
DocumentURLForConsoleLog(WebCore::FrameIdentifier frameID) -> (URL url)

Expand Down
10 changes: 6 additions & 4 deletions Source/WebKit/WebProcess/WebCoreSupport/WebRemoteFrameClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,17 +112,19 @@ void WebRemoteFrameClient::updateRemoteFrameAccessibilityOffset(WebCore::FrameId
page->send(Messages::WebPageProxy::UpdateRemoteFrameAccessibilityOffset(frameID, offset));
}

void WebRemoteFrameClient::bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier frameID, std::span<const uint8_t> dataToken, CompletionHandler<void(std::span<const uint8_t>, int)>&& completionHandler)
void WebRemoteFrameClient::bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier frameID, Vector<uint8_t>&& dataToken, CompletionHandler<void(Vector<uint8_t>, int)>&& completionHandler)
{
RefPtr page = m_frame->page();
if (!page) {
completionHandler(std::span<const uint8_t> { }, 0);
completionHandler({ }, 0);
return;
}

auto sendResult = page->sendSync(Messages::WebPageProxy::BindRemoteAccessibilityFrames(processIdentifier, frameID, dataToken));
if (!sendResult.succeeded())
auto sendResult = page->sendSync(Messages::WebPageProxy::BindRemoteAccessibilityFrames(processIdentifier, frameID, WTFMove(dataToken)));
if (!sendResult.succeeded()) {
completionHandler({ }, 0);
return;
}

auto [resultToken, processIdentifierResult] = sendResult.takeReply();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class WebRemoteFrameClient final : public WebCore::RemoteFrameClient, public Web
void postMessageToRemote(WebCore::FrameIdentifier source, const String& sourceOrigin, WebCore::FrameIdentifier target, std::optional<WebCore::SecurityOriginData> targetOrigin, const WebCore::MessageWithMessagePorts&) final;
void changeLocation(WebCore::FrameLoadRequest&&) final;
String renderTreeAsText(size_t baseIndent, OptionSet<WebCore::RenderAsTextFlag>) final;
void bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier, std::span<const uint8_t>, CompletionHandler<void(std::span<const uint8_t>, int)>&&) final;
void bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier, Vector<uint8_t>&&, CompletionHandler<void(Vector<uint8_t>, int)>&&) final;
void unbindRemoteAccessibilityFrames(int) final;
void updateRemoteFrameAccessibilityOffset(WebCore::FrameIdentifier, WebCore::IntPoint) final;

Expand Down
6 changes: 3 additions & 3 deletions Source/WebKit/WebProcess/WebPage/Cocoa/WebPageCocoa.mm
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,7 @@
#endif
}

void WebPage::bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier frameID, std::span<const uint8_t> dataToken, CompletionHandler<void(std::span<const uint8_t>, int)>&& completionHandler)
void WebPage::bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier frameID, Vector<uint8_t> dataToken, CompletionHandler<void(Vector<uint8_t>, int)>&& completionHandler)
{
RefPtr webFrame = WebProcess::singleton().webFrame(frameID);
if (!webFrame) {
Expand All @@ -603,10 +603,10 @@
return completionHandler({ }, 0);
}

registerRemoteFrameAccessibilityTokens(processIdentifier, dataToken);
registerRemoteFrameAccessibilityTokens(processIdentifier, dataToken.span());

// Get our remote token data and send back to the RemoteFrame.
completionHandler(span(accessibilityRemoteTokenData().get()), getpid());
completionHandler({ span(accessibilityRemoteTokenData().get()) }, getpid());
}

#if ENABLE(APPLE_PAY)
Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/WebProcess/WebPage/WebPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1564,7 +1564,7 @@ void WebPage::platformDidSelectAll()
#endif // !PLATFORM(IOS_FAMILY)

#if !PLATFORM(COCOA)
void WebPage::bindRemoteAccessibilityFrames(int, WebCore::FrameIdentifier, std::span<const uint8_t>, CompletionHandler<void(std::span<const uint8_t>, int)>&&)
void WebPage::bindRemoteAccessibilityFrames(int, WebCore::FrameIdentifier, Vector<uint8_t>, CompletionHandler<void(Vector<uint8_t>, int)>&&)
{
}

Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/WebProcess/WebPage/WebPage.h
Original file line number Diff line number Diff line change
Expand Up @@ -2259,7 +2259,7 @@ class WebPage : public API::ObjectImpl<API::Object::Type::BundlePage>, public IP
void remotePostMessage(WebCore::FrameIdentifier source, const String& sourceOrigin, WebCore::FrameIdentifier target, std::optional<WebCore::SecurityOriginData>&& targetOrigin, const WebCore::MessageWithMessagePorts&);
void renderTreeAsTextForTesting(WebCore::FrameIdentifier, size_t baseIndent, OptionSet<WebCore::RenderAsTextFlag>, CompletionHandler<void(String&&)>&&);
void frameTextForTesting(WebCore::FrameIdentifier, CompletionHandler<void(String&&)>&&);
void bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier, std::span<const uint8_t>, CompletionHandler<void(std::span<const uint8_t>, int)>&&);
void bindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier, Vector<uint8_t>, CompletionHandler<void(Vector<uint8_t>, int)>&&);
void updateRemotePageAccessibilityOffset(WebCore::FrameIdentifier, WebCore::IntPoint);

void requestTargetedElement(WebCore::TargetedElementRequest&&, CompletionHandler<void(Vector<WebCore::TargetedElementInfo>&&)>&&);
Expand Down
2 changes: 1 addition & 1 deletion Source/WebKit/WebProcess/WebPage/WebPage.messages.in
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ GenerateSyntheticEditingCommand(enum:uint8_t WebKit::SyntheticEditingCommandType

CopyLinkToHighlight()

BindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier frameID, std::span<const uint8_t> dataToken) -> (std::span<const uint8_t> token, int processIdentifier) Synchronous
BindRemoteAccessibilityFrames(int processIdentifier, WebCore::FrameIdentifier frameID, Vector<uint8_t> dataToken) -> (Vector<uint8_t> token, int processIdentifier) Synchronous
UpdateRemotePageAccessibilityOffset(WebCore::FrameIdentifier frameID, WebCore::IntPoint offset);

#if PLATFORM(COCOA)
Expand Down

0 comments on commit a3d84e2

Please sign in to comment.