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

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: fix setTimeout call 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
« no previous file with comments | « no previous file | chrome/renderer/resources/extensions/web_view_events.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..7dbd1db488c9a22c985bbba5a6fe0dc9e63b046e 100644
--- a/chrome/browser/apps/web_view_interactive_browsertest.cc
+++ b/chrome/browser/apps/web_view_interactive_browsertest.cc
@@ -37,32 +37,58 @@ 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_;
}
+ // Waits so that at least |expected_remove_count| guests' creation
+ // has been seen by this manager.
+ void WaitForGuestRemoved(size_t expected_remove_count) {
+ if (guest_remove_count_ >= expected_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 (message_loop_runner_.get())
- message_loop_runner_->Quit();
+ if (add_message_loop_runner_.get())
+ add_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 +284,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) {
@@ -733,6 +759,13 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, EditCommandsNoMenu) {
}
IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest,
+ NewWindow_AttachAfterOpenerDestroyed) {
+ TestHelper("testNewWindowAttachAfterOpenerDestroyed",
+ "web_view/newwindow",
+ NEEDS_TEST_SERVER);
+}
+
+IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest,
NewWindow_NewWindowNameTakesPrecedence) {
TestHelper("testNewWindowNameTakesPrecedence",
"web_view/newwindow",
@@ -741,13 +774,13 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest,
IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest,
NewWindow_WebViewNameTakesPrecedence) {
- TestHelper("testWebViewNameTakesPrecedence",
+ TestHelper("testNewWindowWebViewNameTakesPrecedence",
"web_view/newwindow",
NEEDS_TEST_SERVER);
}
IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, NewWindow_NoName) {
- TestHelper("testNoName",
+ TestHelper("testNewWindowNoName",
"web_view/newwindow",
NEEDS_TEST_SERVER);
}
@@ -783,6 +816,13 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest,
NEEDS_TEST_SERVER);
}
+IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest,
+ NewWindow_DiscardAfterOpenerDestroyed) {
+ TestHelper("testNewWindowDiscardAfterOpenerDestroyed",
+ "web_view/newwindow",
+ NEEDS_TEST_SERVER);
+}
+
IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, NewWindow_WebRequest) {
TestHelper("testNewWindowWebRequest",
"web_view/newwindow",
@@ -831,6 +871,19 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, NewWindow_OpenInNewTab) {
ASSERT_TRUE(done_listener->WaitUntilSatisfied());
}
+IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest,
+ NewWindow_OpenerDestroyedWhileUnattached) {
+ TestHelper("testNewWindowOpenerDestroyedWhileUnattached",
+ "web_view/newwindow",
+ NEEDS_TEST_SERVER);
+ ASSERT_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(
« no previous file with comments | « no previous file | chrome/renderer/resources/extensions/web_view_events.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698