Index: chrome/browser/apps/web_view_interactive_browsertest.cc |
diff --git a/chrome/browser/apps/web_view_interactive_browsertest.cc b/chrome/browser/apps/web_view_interactive_browsertest.cc |
index 5e4c805bd0de9ec45c34e0e1dfe0b68b9afabbe1..322b957e76ed46c0286f69d654229a4e81c8351e 100644 |
--- a/chrome/browser/apps/web_view_interactive_browsertest.cc |
+++ b/chrome/browser/apps/web_view_interactive_browsertest.cc |
@@ -37,32 +37,56 @@ using extensions::AppWindow; |
class TestGuestViewManager : public extensions::GuestViewManager { |
public: |
- explicit TestGuestViewManager(content::BrowserContext* context) : |
- GuestViewManager(context), |
- web_contents_(NULL) {} |
+ explicit TestGuestViewManager(content::BrowserContext* context) |
+ : GuestViewManager(context), |
+ guest_add_count_(0), |
+ guest_remove_count_(0), |
+ web_contents_(NULL) {} |
- content::WebContents* WaitForGuestCreated() { |
+ content::WebContents* WaitForGuestAdded() { |
if (web_contents_) |
return web_contents_; |
- message_loop_runner_ = new content::MessageLoopRunner; |
- message_loop_runner_->Run(); |
+ add_message_loop_runner_ = new content::MessageLoopRunner; |
+ add_message_loop_runner_->Run(); |
return web_contents_; |
} |
+ void WaitForGuestRemoved(size_t expected_remove_count) { |
+ if (expected_remove_count == guest_remove_count_) |
+ return; |
+ |
+ remove_message_loop_runner_ = new content::MessageLoopRunner; |
+ remove_message_loop_runner_->Run(); |
+ } |
+ |
+ size_t guest_add_count() { return guest_add_count_; } |
+ |
private: |
// GuestViewManager override: |
virtual void AddGuest(int guest_instance_id, |
content::WebContents* guest_web_contents) OVERRIDE{ |
GuestViewManager::AddGuest(guest_instance_id, guest_web_contents); |
web_contents_ = guest_web_contents; |
+ ++guest_add_count_; |
+ |
+ if (add_message_loop_runner_.get()) |
+ add_message_loop_runner_->Quit(); |
+ } |
- if (message_loop_runner_.get()) |
- message_loop_runner_->Quit(); |
+ virtual void RemoveGuest(int guest_instance_id) OVERRIDE { |
+ GuestViewManager::RemoveGuest(guest_instance_id); |
+ ++guest_remove_count_; |
+ |
+ if (remove_message_loop_runner_.get()) |
+ remove_message_loop_runner_->Quit(); |
} |
+ size_t guest_add_count_; |
+ size_t guest_remove_count_; |
content::WebContents* web_contents_; |
- scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
+ scoped_refptr<content::MessageLoopRunner> add_message_loop_runner_; |
+ scoped_refptr<content::MessageLoopRunner> remove_message_loop_runner_; |
}; |
// Test factory for creating test instances of GuestViewManager. |
@@ -258,7 +282,7 @@ class WebViewInteractiveTest |
ASSERT_TRUE(done_listener); |
ASSERT_TRUE(done_listener->WaitUntilSatisfied()); |
- guest_web_contents_ = GetGuestViewManager()->WaitForGuestCreated(); |
+ guest_web_contents_ = GetGuestViewManager()->WaitForGuestAdded(); |
} |
void RunTest(const std::string& app_name) { |
@@ -831,6 +855,19 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, NewWindow_OpenInNewTab) { |
ASSERT_TRUE(done_listener->WaitUntilSatisfied()); |
} |
+IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, |
+ NewWindow_OpenerDestroyedBeforeAttach) { |
+ TestHelper("testNewWindowOpenerDestroyedBeforeAttach", |
+ "web_view/newwindow", |
+ NEEDS_TEST_SERVER); |
+ EXPECT_EQ(2u, GetGuestViewManager()->guest_add_count()); |
+ |
+ // We have two guests in this test, one is the intial one, the other |
+ // is the newwindow one. |
+ // Before the embedder goes away, both the guests should go away. |
+ // This ensures that unattached guests are gone if opener is gone. |
+ GetGuestViewManager()->WaitForGuestRemoved(2u); |
+} |
IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, ExecuteCode) { |
ASSERT_TRUE(RunPlatformAppTestWithArg( |