<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[281668] trunk/Source/WebKit</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/281668">281668</a></dd>
<dt>Author</dt> <dd>wenson_hsieh@apple.com</dd>
<dt>Date</dt> <dd>2021-08-26 16:02:17 -0700 (Thu, 26 Aug 2021)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add type-safe transaction identifiers for EditorState and FocusedElementInformation
https://bugs.webkit.org/show_bug.cgi?id=229571

Reviewed by Tim Horton.

Make `transactionID` a monotonic object identifier instead of a generic `TransactionID`, and replace
`FocusedElementIdentifier` (which is currently type-defined to `uint64_t`) with its own monotonic object
identifier type.

In a future patch, I plan to implement a mechanism to synchronize `EditorState` and `FocusedElementInformation`
updates, which would require one or both of these objects to hold both types of transactional identifiers; in
order to do this, we need to ensure that these two identifiers are distinct types, so that they can't be easily
mixed up.

* Shared/EditorState.cpp:
(WebKit::EditorState::encode const):
(WebKit::EditorState::decode):
* Shared/EditorState.h:
* Shared/FocusedElementInformation.cpp:
(WebKit::FocusedElementInformation::encode const):
(WebKit::FocusedElementInformation::decode):
* Shared/FocusedElementInformation.h:
* Shared/IdentifierTypes.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::updateEditorState):
* UIProcess/ios/WKContentViewInteraction.mm:
(-[WKContentView updateCurrentFocusedElementInformation:]):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::editorState const):
(WebKit::WebPage::elementDidFocus):
* WebProcess/WebPage/WebPage.h:

Additionally rename `m_currentFocusedElementIdentifier` to `m_lastFocusedElementInformationIdentifier`, for
consistency with `m_lastEditorStateIdentifier`.

* WebProcess/WebPage/ios/WebPageIOS.mm:
(WebKit::WebPage::focusedElementInformation):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKitChangeLog">trunk/Source/WebKit/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitSharedEditorStatecpp">trunk/Source/WebKit/Shared/EditorState.cpp</a></li>
<li><a href="#trunkSourceWebKitSharedEditorStateh">trunk/Source/WebKit/Shared/EditorState.h</a></li>
<li><a href="#trunkSourceWebKitSharedFocusedElementInformationcpp">trunk/Source/WebKit/Shared/FocusedElementInformation.cpp</a></li>
<li><a href="#trunkSourceWebKitSharedFocusedElementInformationh">trunk/Source/WebKit/Shared/FocusedElementInformation.h</a></li>
<li><a href="#trunkSourceWebKitSharedIdentifierTypesh">trunk/Source/WebKit/Shared/IdentifierTypes.h</a></li>
<li><a href="#trunkSourceWebKitUIProcessWebPageProxycpp">trunk/Source/WebKit/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKitUIProcessiosWKContentViewInteractionmm">trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm</a></li>
<li><a href="#trunkSourceWebKitWebProcessWebPageWebPagecpp">trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp</a></li>
<li><a href="#trunkSourceWebKitWebProcessWebPageWebPageh">trunk/Source/WebKit/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKitWebProcessWebPageiosWebPageIOSmm">trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKitChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/ChangeLog (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/ChangeLog    2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/ChangeLog       2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -1,3 +1,43 @@
</span><ins>+2021-08-26  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        Add type-safe transaction identifiers for EditorState and FocusedElementInformation
+        https://bugs.webkit.org/show_bug.cgi?id=229571
+
+        Reviewed by Tim Horton.
+
+        Make `transactionID` a monotonic object identifier instead of a generic `TransactionID`, and replace
+        `FocusedElementIdentifier` (which is currently type-defined to `uint64_t`) with its own monotonic object
+        identifier type.
+
+        In a future patch, I plan to implement a mechanism to synchronize `EditorState` and `FocusedElementInformation`
+        updates, which would require one or both of these objects to hold both types of transactional identifiers; in
+        order to do this, we need to ensure that these two identifiers are distinct types, so that they can't be easily
+        mixed up.
+
+        * Shared/EditorState.cpp:
+        (WebKit::EditorState::encode const):
+        (WebKit::EditorState::decode):
+        * Shared/EditorState.h:
+        * Shared/FocusedElementInformation.cpp:
+        (WebKit::FocusedElementInformation::encode const):
+        (WebKit::FocusedElementInformation::decode):
+        * Shared/FocusedElementInformation.h:
+        * Shared/IdentifierTypes.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::updateEditorState):
+        * UIProcess/ios/WKContentViewInteraction.mm:
+        (-[WKContentView updateCurrentFocusedElementInformation:]):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::editorState const):
+        (WebKit::WebPage::elementDidFocus):
+        * WebProcess/WebPage/WebPage.h:
+
+        Additionally rename `m_currentFocusedElementIdentifier` to `m_lastFocusedElementInformationIdentifier`, for
+        consistency with `m_lastEditorStateIdentifier`.
+
+        * WebProcess/WebPage/ios/WebPageIOS.mm:
+        (WebKit::WebPage::focusedElementInformation):
+
</ins><span class="cx"> 2021-08-26  Cameron McCormack  <heycam@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Manually release SharedBitmap if CGBitmapContextCreateWithData fails and doesn't do it
</span></span></pre></div>
<a id="trunkSourceWebKitSharedEditorStatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Shared/EditorState.cpp (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Shared/EditorState.cpp       2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/Shared/EditorState.cpp  2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> void EditorState::encode(IPC::Encoder& encoder) const
</span><span class="cx"> {
</span><del>-    encoder << transactionID;
</del><ins>+    encoder << identifier;
</ins><span class="cx">     encoder << originIdentifierForPasteboard;
</span><span class="cx">     encoder << shouldIgnoreSelectionChanges;
</span><span class="cx">     encoder << selectionIsNone;
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool EditorState::decode(IPC::Decoder& decoder, EditorState& result)
</span><span class="cx"> {
</span><del>-    if (!decoder.decode(result.transactionID))
</del><ins>+    if (!decoder.decode(result.identifier))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     if (!decoder.decode(result.originIdentifierForPasteboard))
</span></span></pre></div>
<a id="trunkSourceWebKitSharedEditorStateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Shared/EditorState.h (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Shared/EditorState.h 2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/Shared/EditorState.h    2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "ArgumentCoders.h"
</span><del>-#include "TransactionID.h"
</del><ins>+#include "IdentifierTypes.h"
</ins><span class="cx"> #include <WebCore/Color.h>
</span><span class="cx"> #include <WebCore/FontAttributes.h>
</span><span class="cx"> #include <WebCore/IntRect.h>
</span><span class="lines">@@ -70,7 +70,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> struct EditorState {
</span><del>-    TransactionID transactionID;
</del><ins>+    EditorStateIdentifier identifier;
</ins><span class="cx">     String originIdentifierForPasteboard;
</span><span class="cx">     bool shouldIgnoreSelectionChanges { false };
</span><span class="cx">     bool selectionIsNone { true }; // This will be false when there is a caret selection.
</span></span></pre></div>
<a id="trunkSourceWebKitSharedFocusedElementInformationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Shared/FocusedElementInformation.cpp (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Shared/FocusedElementInformation.cpp 2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/Shared/FocusedElementInformation.cpp    2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -98,7 +98,7 @@
</span><span class="cx">     encoder << placeholder;
</span><span class="cx">     encoder << label;
</span><span class="cx">     encoder << ariaLabel;
</span><del>-    encoder << focusedElementIdentifier;
</del><ins>+    encoder << identifier;
</ins><span class="cx">     encoder << containerScrollingNodeID;
</span><span class="cx"> #if ENABLE(DATALIST_ELEMENT)
</span><span class="cx">     encoder << hasSuggestions;
</span><span class="lines">@@ -223,7 +223,7 @@
</span><span class="cx">     if (!decoder.decode(result.ariaLabel))
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    if (!decoder.decode(result.focusedElementIdentifier))
</del><ins>+    if (!decoder.decode(result.identifier))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     if (!decoder.decode(result.containerScrollingNodeID))
</span></span></pre></div>
<a id="trunkSourceWebKitSharedFocusedElementInformationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Shared/FocusedElementInformation.h (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Shared/FocusedElementInformation.h   2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/Shared/FocusedElementInformation.h      2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "ArgumentCoders.h"
</span><ins>+#include "IdentifierTypes.h"
</ins><span class="cx"> #include <WebCore/AutocapitalizeTypes.h>
</span><span class="cx"> #include <WebCore/Autofill.h>
</span><span class="cx"> #include <WebCore/Color.h>
</span><span class="lines">@@ -87,8 +88,6 @@
</span><span class="cx">     static std::optional<OptionItem> decode(IPC::Decoder&);
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-using FocusedElementIdentifier = uint64_t;
-
</del><span class="cx"> struct FocusedElementInformation {
</span><span class="cx">     WebCore::IntRect interactionRect;
</span><span class="cx">     WebCore::ElementContext elementContext;
</span><span class="lines">@@ -140,7 +139,7 @@
</span><span class="cx">     bool shouldUseLegacySelectPopoverDismissalBehaviorInDataActivation { false };
</span><span class="cx">     bool isFocusingWithValidationMessage { false };
</span><span class="cx"> 
</span><del>-    FocusedElementIdentifier focusedElementIdentifier { 0 };
</del><ins>+    FocusedElementInformationIdentifier identifier;
</ins><span class="cx">     WebCore::ScrollingNodeID containerScrollingNodeID { 0 };
</span><span class="cx"> 
</span><span class="cx">     void encode(IPC::Encoder&) const;
</span></span></pre></div>
<a id="trunkSourceWebKitSharedIdentifierTypesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/Shared/IdentifierTypes.h (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/Shared/IdentifierTypes.h     2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/Shared/IdentifierTypes.h        2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><ins>+#include "MonotonicObjectIdentifier.h"
</ins><span class="cx"> #include <wtf/ObjectIdentifier.h>
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -41,4 +42,10 @@
</span><span class="cx"> enum TextCheckerRequestType { };
</span><span class="cx"> using TextCheckerRequestID = ObjectIdentifier<TextCheckerRequestType>;
</span><span class="cx"> 
</span><ins>+enum EditorStateIdentifierType { };
+using EditorStateIdentifier = MonotonicObjectIdentifier<EditorStateIdentifierType>;
+
+enum FocusedElementInformationIdentifierType { };
+using FocusedElementInformationIdentifier = MonotonicObjectIdentifier<FocusedElementInformationIdentifierType>;
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKitUIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp   2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp      2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -7459,7 +7459,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool WebPageProxy::updateEditorState(const EditorState& newEditorState)
</span><span class="cx"> {
</span><del>-    if (newEditorState.transactionID < m_editorState.transactionID)
</del><ins>+    if (newEditorState.identifier < m_editorState.identifier)
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     auto oldEditorState = std::exchange(m_editorState, newEditorState);
</span></span></pre></div>
<a id="trunkSourceWebKitUIProcessiosWKContentViewInteractionmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm    2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/UIProcess/ios/WKContentViewInteraction.mm       2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -6684,9 +6684,9 @@
</span><span class="cx"> - (void)updateCurrentFocusedElementInformation:(Function<void(bool didUpdate)>&&)callback
</span><span class="cx"> {
</span><span class="cx">     WeakObjCPtr<WKContentView> weakSelf { self };
</span><del>-    auto identifierBeforeUpdate = _focusedElementInformation.focusedElementIdentifier;
</del><ins>+    auto identifierBeforeUpdate = _focusedElementInformation.identifier;
</ins><span class="cx">     _page->requestFocusedElementInformation([callback = WTFMove(callback), identifierBeforeUpdate, weakSelf] (auto& info) {
</span><del>-        if (!weakSelf || !info || info->focusedElementIdentifier != identifierBeforeUpdate) {
</del><ins>+        if (!weakSelf || !info || info->identifier != identifierBeforeUpdate) {
</ins><span class="cx">             // If the focused element may have changed in the meantime, don't overwrite focused element information.
</span><span class="cx">             callback(false);
</span><span class="cx">             return;
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessWebPageWebPagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp       2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp  2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -1225,7 +1225,7 @@
</span><span class="cx">     const VisibleSelection& selection = frame->selection().selection();
</span><span class="cx">     auto& editor = frame->editor();
</span><span class="cx"> 
</span><del>-    result.transactionID = m_lastEditorStateTransactionID.increment();
</del><ins>+    result.identifier = m_lastEditorStateIdentifier.increment();
</ins><span class="cx">     result.selectionIsNone = selection.isNone();
</span><span class="cx">     result.selectionIsRange = selection.isRange();
</span><span class="cx">     result.isContentEditable = selection.isContentEditable();
</span><span class="lines">@@ -6031,7 +6031,6 @@
</span><span class="cx">             element.document().fullscreenManager().cancelFullscreen();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-        ++m_currentFocusedElementIdentifier;
</del><span class="cx">         auto information = focusedElementInformation();
</span><span class="cx">         if (!information)
</span><span class="cx">             return;
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h 2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h    2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -2243,7 +2243,7 @@
</span><span class="cx">     WebCore::FloatRect m_previousExposedContentRect;
</span><span class="cx">     OptionSet<WebKit::WebEvent::Modifier> m_pendingSyntheticClickModifiers;
</span><span class="cx">     WebCore::PointerID m_pendingSyntheticClickPointerId { 0 };
</span><del>-    FocusedElementIdentifier m_currentFocusedElementIdentifier { 0 };
</del><ins>+    FocusedElementInformationIdentifier m_lastFocusedElementInformationIdentifier;
</ins><span class="cx">     std::optional<DynamicViewportSizeUpdateID> m_pendingDynamicViewportSizeUpdateID;
</span><span class="cx">     double m_lastTransactionPageScaleFactor { 0 };
</span><span class="cx">     TransactionID m_lastTransactionIDWithScaleChange;
</span><span class="lines">@@ -2282,7 +2282,7 @@
</span><span class="cx"> 
</span><span class="cx">     enum class EditorStateIsContentEditable { No, Yes, Unset };
</span><span class="cx">     mutable EditorStateIsContentEditable m_lastEditorStateWasContentEditable { EditorStateIsContentEditable::Unset };
</span><del>-    mutable TransactionID m_lastEditorStateTransactionID;
</del><ins>+    mutable EditorStateIdentifier m_lastEditorStateIdentifier;
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(GTK) || PLATFORM(WPE)
</span><span class="cx">     std::optional<InputMethodState> m_inputMethodState;
</span></span></pre></div>
<a id="trunkSourceWebKitWebProcessWebPageiosWebPageIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm (281667 => 281668)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm 2021-08-26 22:50:10 UTC (rev 281667)
+++ trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm    2021-08-26 23:02:17 UTC (rev 281668)
</span><span class="lines">@@ -3226,7 +3226,7 @@
</span><span class="cx">         information.previousNodeRect = rootViewBounds(*previousElement);
</span><span class="cx">         information.hasPreviousNode = true;
</span><span class="cx">     }
</span><del>-    information.focusedElementIdentifier = m_currentFocusedElementIdentifier;
</del><ins>+    information.identifier = m_lastFocusedElementInformationIdentifier.increment();
</ins><span class="cx"> 
</span><span class="cx">     if (is<LabelableElement>(*focusedElement)) {
</span><span class="cx">         if (auto labels = downcast<LabelableElement>(*focusedElement).labels()) {
</span></span></pre>
</div>
</div>

</body>
</html>