Chromium Code Reviews| 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) { |