Index: ui/accelerated_widget_mac/display_link_mac.cc |
diff --git a/ui/accelerated_widget_mac/display_link_mac.cc b/ui/accelerated_widget_mac/display_link_mac.cc |
index d9cc46876f9f53a8aea2e04a668421efe6f5ffd5..b7c5805870c7c52b0cc170a364f8e5edae6cda10 100644 |
--- a/ui/accelerated_widget_mac/display_link_mac.cc |
+++ b/ui/accelerated_widget_mac/display_link_mac.cc |
@@ -86,6 +86,14 @@ DisplayLinkMac::DisplayLinkMac( |
DisplayLinkMac::~DisplayLinkMac() { |
StopDisplayLink(); |
+ // Usually |display_link_| holds the last reference to CVDisplayLinkRef, but |
+ // that's not guaranteed, so it might not free all resources after the |
+ // destructor completes. Ensure the callback is cleared out regardless to |
+ // avoid possible crashes (see http://crbug.com/564780). |
+ CVReturn ret = |
+ CVDisplayLinkSetOutputCallback(display_link_, nullptr, nullptr); |
+ DCHECK_EQ(kCGErrorSuccess, ret); |
+ |
DisplayMap::iterator found = display_map_.Get().find(display_id_); |
DCHECK(found != display_map_.Get().end()); |
DCHECK(found->second == this); |