Chromium Code Reviews| Index: chrome/browser/guest_view/guest_view_base.cc |
| diff --git a/chrome/browser/guest_view/guest_view_base.cc b/chrome/browser/guest_view/guest_view_base.cc |
| index 12f62c5ccb01fa6df1cfedfcb1d405758dc19318..9dd5a6a981d64119c0525773eedaf77f6e61ea3d 100644 |
| --- a/chrome/browser/guest_view/guest_view_base.cc |
| +++ b/chrome/browser/guest_view/guest_view_base.cc |
| @@ -40,10 +40,33 @@ scoped_ptr<base::DictionaryValue> GuestViewBase::Event::GetArguments() { |
| return args_.Pass(); |
| } |
| +class GuestViewBase::EmbedderWebContentsObserver : public WebContentsObserver { |
|
lazyboy
2014/05/29 19:13:58
Add a note saying this observer ensures we destroy
Fady Samuel
2014/05/29 21:21:12
Done.
|
| + public: |
| + explicit EmbedderWebContentsObserver(GuestViewBase* guest) |
| + : WebContentsObserver(guest->embedder_web_contents()), |
| + guest_(guest) { |
| + } |
| + |
| + virtual ~EmbedderWebContentsObserver() { |
| + } |
| + |
| + // WebContentsObserver implementation. |
| + virtual void WebContentsDestroyed() OVERRIDE { |
| + guest_->embedder_web_contents_ = NULL; |
| + guest_->EmbedderDestroyed(); |
| + guest_->Destroy(); |
| + } |
| + |
| + private: |
| + GuestViewBase* guest_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(EmbedderWebContentsObserver); |
| +}; |
| + |
| GuestViewBase::GuestViewBase(int guest_instance_id, |
| WebContents* guest_web_contents, |
| const std::string& embedder_extension_id) |
| - : guest_web_contents_(guest_web_contents), |
| + : WebContentsObserver(guest_web_contents), |
| embedder_web_contents_(NULL), |
| embedder_extension_id_(embedder_extension_id), |
| embedder_render_process_id_(0), |
| @@ -155,6 +178,8 @@ base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() { |
| void GuestViewBase::Attach(content::WebContents* embedder_web_contents, |
| const base::DictionaryValue& args) { |
| embedder_web_contents_ = embedder_web_contents; |
| + embedder_web_contents_observer_.reset( |
| + new EmbedderWebContentsObserver(this)); |
| embedder_render_process_id_ = |
| embedder_web_contents->GetRenderProcessHost()->GetID(); |
| args.GetInteger(guestview::kParameterInstanceId, &view_instance_id_); |
| @@ -178,7 +203,7 @@ void GuestViewBase::Attach(content::WebContents* embedder_web_contents, |
| void GuestViewBase::Destroy() { |
| if (!destruction_callback_.is_null()) |
| - destruction_callback_.Run(guest_web_contents()); |
| + destruction_callback_.Run(); |
| delete guest_web_contents(); |
| } |
| @@ -196,6 +221,10 @@ void GuestViewBase::RegisterDestructionCallback( |
| destruction_callback_ = callback; |
| } |
| +void GuestViewBase::WebContentsDestroyed() { |
| + delete this; |
| +} |
| + |
| bool GuestViewBase::ShouldFocusPageAfterCrash() { |
| // Focus is managed elsewhere. |
| return false; |