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; |