Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(450)

Unified Diff: chrome/browser/apps/web_view_interactive_browsertest.cc

Issue 558813002: <webview>: Fix an issue with destroying an opener that has unattached guests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698