Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1609)

Unified Diff: content/renderer/accessibility/render_accessibility_impl.cc

Issue 2341503002: Fix race condition causing DCHECK(ack_pending_) to trip. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 74e35013b4fc00b461cd3ed2b5d03c84aa3de3c8..f22ec1c04755b9fc135a51a2f41803b01b9f6155 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -40,6 +40,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
@@ -79,6 +85,7 @@ RenderAccessibilityImpl::RenderAccessibilityImpl(RenderFrameImpl* render_frame)
ack_pending_(false),
reset_token_(0),
weak_factory_(this) {
+ ack_token_ = g_next_ack_token++;
David Tseng 2016/09/14 02:49:42 Perhaps dumb question, but is this global shared a
dmazzoni 2016/09/14 18:58:03 No, but it doesn't need to be. The only issue is w
WebView* web_view = render_frame_->GetRenderView()->GetWebView();
WebSettings* settings = web_view->settings();
settings->setAccessibilityEnabled(true);
@@ -351,7 +358,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)
@@ -431,7 +439,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();

Powered by Google App Engine
This is Rietveld 408576698