| 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 8b146beab6fe09858c1248c059d139b15f2a3554..cc9c7d3f85aadfc5fa2fc458f3f99c56273171ad 100644
|
| --- a/chrome/browser/ui/panels/panel_browsertest.cc
|
| +++ b/chrome/browser/ui/panels/panel_browsertest.cc
|
| @@ -16,6 +16,8 @@
|
| #include "chrome/browser/prefs/browser_prefs.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"
|
| @@ -1400,6 +1402,76 @@ 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();
|
| + content::Source<RenderViewHost> source_render_view_host(
|
| + panel->browser()->GetSelectedTabContents()->render_view_host());
|
| + ui_test_utils::WindowedNotificationObserverWithDetails<bool> signal_cancel(
|
| + content::NOTIFICATION_RENDER_VIEW_HOST_RECEIVED_ON_MSG_SHOULD_CLOSE_ACK,
|
| + source_render_view_host);
|
| + alert->native_dialog()->CancelAppModalDialog();
|
| + signal_cancel.Wait();
|
| +
|
| + bool proceed;
|
| + EXPECT_TRUE(signal_cancel.GetDetailsFor(source_render_view_host.map_key(),
|
| + &proceed));
|
| + EXPECT_FALSE(proceed);
|
| + 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::WindowedNotificationObserverWithDetails<bool> signal_close(
|
| + content::NOTIFICATION_RENDER_VIEW_HOST_RECEIVED_ON_MSG_SHOULD_CLOSE_ACK,
|
| + source_render_view_host);
|
| + alert->native_dialog()->CloseAppModalDialog();
|
| + signal_close.Wait();
|
| +
|
| + EXPECT_TRUE(signal_close.GetDetailsFor(source_render_view_host.map_key(),
|
| + &proceed));
|
| + EXPECT_FALSE(proceed);
|
| + 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::WindowedNotificationObserverWithDetails<bool> signal_accept(
|
| + content::NOTIFICATION_RENDER_VIEW_HOST_RECEIVED_ON_MSG_SHOULD_CLOSE_ACK,
|
| + source_render_view_host);
|
| + alert->native_dialog()->AcceptAppModalDialog();
|
| + signal_accept.Wait();
|
| +
|
| + EXPECT_TRUE(signal_accept.GetDetailsFor(source_render_view_host.map_key(),
|
| + &proceed));
|
| + EXPECT_TRUE(proceed);
|
| + panel_deleted.Wait();
|
| + EXPECT_EQ(0, panel_manager->num_panels());
|
| +}
|
| +
|
| class PanelDownloadTest : public PanelBrowserTest {
|
| public:
|
| PanelDownloadTest() : PanelBrowserTest() { }
|
|
|