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

Unified Diff: chrome/browser/ui/panels/panel_browsertest.cc

Issue 8505047: Fix panels being removed from PanelManager prematurely. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Unit test. Created 9 years, 1 month 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/ui/panels/panel_browsertest.cc
diff --git a/chrome/browser/ui/panels/panel_browsertest.cc b/chrome/browser/ui/panels/panel_browsertest.cc
index 382642ccdf36a36fb05c7138447480a3873d1047..137ab81bfa30d6bce3908c15762a9b6f305cb3f2 100644
--- a/chrome/browser/ui/panels/panel_browsertest.cc
+++ b/chrome/browser/ui/panels/panel_browsertest.cc
@@ -4,11 +4,14 @@
#include "base/bind.h"
#include "base/string_number_conversions.h"
+#include "base/test/test_timeouts.h"
Dmitry Titov 2011/11/11 05:18:10 is this include file needed?
prasadt 2011/11/11 18:29:58 I had it when I was doing timeout instead of waiti
prasadt 2011/11/11 19:22:30 After I sent this, I realized that I could return
#include "chrome/browser/download/download_service.h"
#include "chrome/browser/download/download_service_factory.h"
#include "chrome/browser/net/url_request_mock_util.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
+#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/find_bar/find_bar.h"
@@ -1391,6 +1394,66 @@ IN_PROC_BROWSER_TEST_F(PanelBrowserTest,
panel_other->Close();
}
+IN_PROC_BROWSER_TEST_F(PanelBrowserTest, OnBeforeUnloadOnClose) {
+ PanelManager* panel_manager = PanelManager::GetInstance();
+ EXPECT_EQ(0, panel_manager->num_panels()); // No panels initially.
+
+ // HTML content with onbeforeunload handler.
+ const char* kBeforeUnloadHTML =
+ "<html><head><title>beforeunload</title></head><body>"
+ "<script>window.onbeforeunload=function(e){return 'foo'}</script>"
+ "</body></html>";
+
+ // Create a test panel with tab contents loaded.
+ CreatePanelParams params("PanelTest1", gfx::Rect(0, 0, 100, 100),
+ SHOW_AS_ACTIVE);
+ params.url = GURL(std::string("data:text/html,") + kBeforeUnloadHTML);
+ Panel* panel = CreatePanelWithParams(params);
+ EXPECT_EQ(1, panel_manager->num_panels());
+
+ // Close panel and respond to the onbeforeunload dialog with cancel. This is
+ // equivalent to clicking "Stay on this page"
+ panel->Close();
+ AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
+ ui_test_utils::WindowedNotificationObserver signal_cancel(
+ content::NOTIFICATION_RENDER_VIEW_HOST_RECEIVED_ON_MSG_SHOULD_CLOSE_ACK,
+ content::Source<RenderViewHost>(
+ panel->browser()->GetSelectedTabContents()->render_view_host()));
+ alert->native_dialog()->CancelAppModalDialog();
+ signal_cancel.Wait();
+ EXPECT_EQ(1, panel_manager->num_panels());
+
+ // Close panel and respond to the onbeforeunload dialog with close. This is
+ // equivalent to clicking the OS close button on the dialog.
+ panel->Close();
+ alert = ui_test_utils::WaitForAppModalDialog();
+ ui_test_utils::WindowedNotificationObserver signal_close(
+ content::NOTIFICATION_RENDER_VIEW_HOST_RECEIVED_ON_MSG_SHOULD_CLOSE_ACK,
+ content::Source<RenderViewHost>(
+ panel->browser()->GetSelectedTabContents()->render_view_host()));
+ alert->native_dialog()->CloseAppModalDialog();
+ signal_close.Wait();
+ EXPECT_EQ(1, panel_manager->num_panels());
+
+ // Close panel and respond to the onbeforeunload dialog with accept. This is
+ // equivalent to clicking "Leave this page".
+ ui_test_utils::WindowedNotificationObserver panel_deleted(
+ chrome::NOTIFICATION_PANEL_DELETED,
+ content::Source<Panel>(panel));
+
+ panel->Close();
+ alert = ui_test_utils::WaitForAppModalDialog();
+ ui_test_utils::WindowedNotificationObserver signal_accept(
+ content::NOTIFICATION_RENDER_VIEW_HOST_RECEIVED_ON_MSG_SHOULD_CLOSE_ACK,
+ content::Source<RenderViewHost>(
+ panel->browser()->GetSelectedTabContents()->render_view_host()));
+ alert->native_dialog()->AcceptAppModalDialog();
+ signal_accept.Wait();
+
+ panel_deleted.Wait();
+ EXPECT_EQ(0, panel_manager->num_panels());
+}
+
class PanelDownloadTest : public PanelBrowserTest {
public:
PanelDownloadTest() : PanelBrowserTest() { }

Powered by Google App Engine
This is Rietveld 408576698