Skip to content

Commit

Permalink
[Unified Text Replacement] When a "rich text" text replacement sessio…
Browse files Browse the repository at this point in the history
…n ends, the session should be undone if it is not accepted

https://bugs.webkit.org/show_bug.cgi?id=273709
rdar://127390343

Reviewed by Abrar Rahman Protyasha.

Ensure that `didEndTextReplacementSession` handles both plain text and rich text replacements properly.

* Source/WebKit/WebProcess/WebPage/Cocoa/UnifiedTextReplacementController.mm:
(WebKit::UnifiedTextReplacementController::didEndTextReplacementSession<WebUnifiedTextReplacementType::PlainText>):
(WebKit::UnifiedTextReplacementController::didEndTextReplacementSession<WebUnifiedTextReplacementType::RichText>):
(WebKit::UnifiedTextReplacementController::didEndTextReplacementSession):
* Source/WebKit/WebProcess/WebPage/UnifiedTextReplacementController.h:

Canonical link: https://commits.webkit.org/278345@main
  • Loading branch information
rr-codes committed May 3, 2024
1 parent 9fdc371 commit c53d438
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -213,15 +213,10 @@
}
}

void UnifiedTextReplacementController::didEndTextReplacementSession(const WTF::UUID& uuid, bool accepted)
template<>
void UnifiedTextReplacementController::didEndTextReplacementSession<WebUnifiedTextReplacementType::PlainText>(const WTF::UUID& uuid, bool accepted)
{
RELEASE_LOG(UnifiedTextReplacement, "UnifiedTextReplacementController::didEndTextReplacementSession (%s) [accepted: %d]", uuid.toString().utf8().data(), accepted);

RefPtr document = this->document();
if (!document) {
ASSERT_NOT_REACHED();
return;
}

auto sessionRange = contextRangeForSessionWithUUID(uuid);
if (!sessionRange) {
Expand All @@ -244,9 +239,47 @@

return false;
});
}

template<>
void UnifiedTextReplacementController::didEndTextReplacementSession<WebUnifiedTextReplacementType::RichText>(const WTF::UUID& uuid, bool accepted)
{
if (accepted)
return;

RefPtr document = this->document();

textReplacementSessionPerformEditActionForRichText(*document, uuid, WebTextReplacementData::EditAction::Undo);
}

void UnifiedTextReplacementController::didEndTextReplacementSession(const WTF::UUID& uuid, bool accepted)
{
RELEASE_LOG(UnifiedTextReplacement, "UnifiedTextReplacementController::didEndTextReplacementSession (%s) [accepted: %d]", uuid.toString().utf8().data(), accepted);

RefPtr document = this->document();
if (!document) {
ASSERT_NOT_REACHED();
return;
}

auto replacementType = m_replacementTypes.get(uuid);
switch (replacementType) {
case WebUnifiedTextReplacementType::PlainText:
didEndTextReplacementSession<WebUnifiedTextReplacementType::PlainText>(uuid, accepted);
break;
case WebUnifiedTextReplacementType::RichText:
didEndTextReplacementSession<WebUnifiedTextReplacementType::RichText>(uuid, accepted);
break;
}

m_webPage->removeTextIndicatorStyleForID(uuid);

auto sessionRange = contextRangeForSessionWithUUID(uuid);
if (!sessionRange) {
ASSERT_NOT_REACHED();
return;
}

document->selection().setSelection({ *sessionRange });

m_replacementTypes.remove(uuid);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,9 @@ class UnifiedTextReplacementController final {
void textReplacementSessionPerformEditActionForPlainText(WebCore::Document&, const WTF::UUID&, WebTextReplacementData::EditAction);
void textReplacementSessionPerformEditActionForRichText(WebCore::Document&, const WTF::UUID&, WebTextReplacementData::EditAction);

template<WebUnifiedTextReplacementType Type>
void didEndTextReplacementSession(const WTF::UUID&, bool accepted);

RefPtr<WebCore::Document> document() const;

WeakPtr<WebPage> m_webPage;
Expand Down

0 comments on commit c53d438

Please sign in to comment.