Index: extensions/renderer/extension_frame_helper.cc |
diff --git a/extensions/renderer/extension_frame_helper.cc b/extensions/renderer/extension_frame_helper.cc |
index c063f84a169ba2a5d6915b6cdc121647f9b93e2c..fd0179207be5e977cdabe1eba2ebf956bb4bfd38 100644 |
--- a/extensions/renderer/extension_frame_helper.cc |
+++ b/extensions/renderer/extension_frame_helper.cc |
@@ -123,6 +123,26 @@ void ExtensionFrameHelper::DidCreateNewDocument() { |
did_create_current_document_element_ = false; |
} |
+void ExtensionFrameHelper::AfterDidCreateDocumentElement() { |
+ DCHECK(did_create_current_document_element_); |
+ base::WeakPtr<ExtensionFrameHelper> weak_self = AsWeakPtr(); |
+ |
+ // The JavaScript code can cause re-entrancy. To avoid a deadlock, don't run |
+ // callbacks that are added during the iteration. |
+ std::vector<base::Closure> callbacks; |
+ document_element_created_callbacks_.swap(callbacks); |
+ for (auto& callback : callbacks) { |
+ callback.Run(); |
+ if (!weak_self.get()) |
+ return; // Frame and |this| invalidated by callback. |
+ } |
+} |
+ |
+void ExtensionFrameHelper::ScheduleAfterDidCreateDocumentElement( |
+ const base::Closure& callback) { |
+ document_element_created_callbacks_.push_back(callback); |
+} |
+ |
void ExtensionFrameHelper::DidMatchCSS( |
const blink::WebVector<blink::WebString>& newly_matching_selectors, |
const blink::WebVector<blink::WebString>& stopped_matching_selectors) { |