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..ecc951e95b98970369edb5b985d9d839774daf5b 100644 |
--- a/extensions/renderer/extension_frame_helper.cc |
+++ b/extensions/renderer/extension_frame_helper.cc |
@@ -123,6 +123,27 @@ void ExtensionFrameHelper::DidCreateNewDocument() { |
did_create_current_document_element_ = false; |
} |
+void ExtensionFrameHelper::AfterDidCreateDocumentElement( |
+ const base::WeakPtr<content::RenderFrame>& render_frame_weak) { |
+ DCHECK_EQ(render_frame(), render_frame_weak.get()); |
+ DCHECK(did_create_current_document_element_); |
+ |
+ // 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 (!render_frame_weak.get()) |
+ return; // Frame invalidated by callback. |
ncarter (slow)
2016/02/11 22:47:32
That also means that |this| was deleted (right?).
robwu
2016/02/11 23:36:51
Yes.
|
+ } |
+} |
+ |
+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) { |