Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index 1d26e5940b95c7e048e0c00402c46f46e2753403..f7257fa4e2906ba8290183a698570e25bf0d7e7c 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -3350,8 +3350,17 @@ void RenderFrameImpl::didCreateDocumentElement(blink::WebLocalFrame* frame) { |
} |
} |
- FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
- DidCreateDocumentElement()); |
+ // Notify observers; The frame can be detached by an extension script. |
+ if (observers_.might_have_observers()) { |
nasko
2016/02/08 18:12:53
Yuck :(. Why is this the only method that needs th
robwu
2016/02/09 01:18:10
This is needed because the observers expect the su
|
+ base::WeakPtr<RenderFrameImpl> self = weak_factory_.GetWeakPtr(); |
+ base::ObserverListBase<RenderFrameObserver>::Iterator it(&observers_); |
+ RenderFrameObserver* obs; |
+ while ((obs = it.GetNext()) != nullptr) { |
+ obs->DidCreateDocumentElement(); |
+ if (!self.get()) |
+ return; |
+ } |
+ } |
FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), |
DidCreateDocumentElement(frame)); |
} |
@@ -3395,7 +3404,17 @@ void RenderFrameImpl::didFinishDocumentLoad(blink::WebLocalFrame* frame, |
FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), |
DidFinishDocumentLoad(frame)); |
- FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidFinishDocumentLoad()); |
+ // Notify observers; The frame can be detached by an extension script. |
+ if (observers_.might_have_observers()) { |
+ base::WeakPtr<RenderFrameImpl> self = weak_factory_.GetWeakPtr(); |
+ base::ObserverListBase<RenderFrameObserver>::Iterator it(&observers_); |
+ RenderFrameObserver* obs; |
+ while ((obs = it.GetNext()) != nullptr) { |
+ obs->DidFinishDocumentLoad(); |
+ if (!self.get()) |
+ return; |
+ } |
+ } |
// Check whether we have new encoding name. |
UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); |