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