Index: content/renderer/accessibility/render_accessibility_impl.cc |
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc |
index ec3aad56fc4e8ee17e241f4de1b2bd72d38e80cf..de8c4e877fc57a99631c6ed4d22e149a63aaa690 100644 |
--- a/content/renderer/accessibility/render_accessibility_impl.cc |
+++ b/content/renderer/accessibility/render_accessibility_impl.cc |
@@ -41,6 +41,12 @@ using blink::WebScopedAXContext; |
using blink::WebSettings; |
using blink::WebView; |
+namespace { |
+// The next token to use to distinguish between ack events sent to this |
+// RenderAccessibilityImpl and a previous instance. |
+static int g_next_ack_token = 1; |
+} |
+ |
namespace content { |
// Cap the number of nodes returned in an accessibility |
@@ -81,6 +87,7 @@ RenderAccessibilityImpl::RenderAccessibilityImpl(RenderFrameImpl* render_frame) |
reset_token_(0), |
during_action_(false), |
weak_factory_(this) { |
+ ack_token_ = g_next_ack_token++; |
WebView* web_view = render_frame_->GetRenderView()->GetWebView(); |
WebSettings* settings = web_view->settings(); |
settings->setAccessibilityEnabled(true); |
@@ -363,7 +370,8 @@ void RenderAccessibilityImpl::SendPendingAccessibilityEvents() { |
<< "\n" << event_msg.update.ToString(); |
} |
- Send(new AccessibilityHostMsg_Events(routing_id(), event_msgs, reset_token_)); |
+ Send(new AccessibilityHostMsg_Events(routing_id(), event_msgs, reset_token_, |
+ ack_token_)); |
reset_token_ = 0; |
if (had_layout_complete_messages) |
@@ -443,7 +451,11 @@ void RenderAccessibilityImpl::OnDoDefaultAction(int acc_obj_id) { |
obj.performDefaultAction(); |
} |
-void RenderAccessibilityImpl::OnEventsAck() { |
+void RenderAccessibilityImpl::OnEventsAck(int ack_token) { |
+ // Ignore acks intended for a different or previous instance. |
+ if (ack_token_ != ack_token) |
+ return; |
+ |
DCHECK(ack_pending_); |
ack_pending_ = false; |
SendPendingAccessibilityEvents(); |