Index: content/browser/browser_plugin/test_browser_plugin_guest_delegate.cc |
diff --git a/content/browser/browser_plugin/test_browser_plugin_guest_delegate.cc b/content/browser/browser_plugin/test_browser_plugin_guest_delegate.cc |
index 9621ba927d3f105b8afc260f6f6d56ab03adfef8..41aa7fed44cf35f053cda66e5f102b611a4517f8 100644 |
--- a/content/browser/browser_plugin/test_browser_plugin_guest_delegate.cc |
+++ b/content/browser/browser_plugin/test_browser_plugin_guest_delegate.cc |
@@ -11,14 +11,43 @@ |
namespace content { |
+// This observer ensures that the TestBrowserPluginGuestDelegate destroys itself |
+// when its embedder goes away. |
+class TestBrowserPluginGuestDelegate::EmbedderWebContentsObserver : |
+ public WebContentsObserver { |
+ public: |
+ explicit EmbedderWebContentsObserver(TestBrowserPluginGuestDelegate* guest) |
+ : WebContentsObserver(guest->GetEmbedderWebContents()), |
+ guest_(guest) { |
+ } |
+ |
+ virtual ~EmbedderWebContentsObserver() { |
+ } |
+ |
+ // WebContentsObserver implementation. |
+ virtual void WebContentsDestroyed() OVERRIDE { |
+ guest_->Destroy(); |
+ } |
+ |
+ private: |
+ TestBrowserPluginGuestDelegate* guest_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(EmbedderWebContentsObserver); |
+}; |
+ |
TestBrowserPluginGuestDelegate::TestBrowserPluginGuestDelegate( |
BrowserPluginGuest* guest) : |
+ WebContentsObserver(guest->GetWebContents()), |
guest_(guest) { |
} |
TestBrowserPluginGuestDelegate::~TestBrowserPluginGuestDelegate() { |
} |
+WebContents* TestBrowserPluginGuestDelegate::GetEmbedderWebContents() const { |
+ return guest_->embedder_web_contents(); |
+} |
+ |
void TestBrowserPluginGuestDelegate::LoadURLWithParams( |
const GURL& url, |
const Referrer& referrer, |
@@ -31,9 +60,19 @@ void TestBrowserPluginGuestDelegate::LoadURLWithParams( |
web_contents->GetController().LoadURLWithParams(load_url_params); |
} |
+void TestBrowserPluginGuestDelegate::WebContentsDestroyed() { |
+ delete this; |
+} |
+ |
+void TestBrowserPluginGuestDelegate::DidAttach() { |
+ embedder_web_contents_observer_.reset( |
+ new EmbedderWebContentsObserver(this)); |
+ |
+} |
+ |
void TestBrowserPluginGuestDelegate::Destroy() { |
if (!destruction_callback_.is_null()) |
- destruction_callback_.Run(guest_->GetWebContents()); |
+ destruction_callback_.Run(); |
delete guest_->GetWebContents(); |
} |