diff --git a/tests/unittests/navigation_unittest.cc b/tests/unittests/navigation_unittest.cc index 3770b3d99..cf9e78465 100644 --- a/tests/unittests/navigation_unittest.cc +++ b/tests/unittests/navigation_unittest.cc @@ -613,6 +613,145 @@ TEST(NavigationTest, History) { } +namespace { + +const char kDynIfrNav1[] = "http://tests-dynframe/nav1.html"; +const char kDynIfrNav2[] = "http://tests-dynframe/nav2.html"; + +bool g_history_dynamic_iframes_nav_test = false; + +// Browser side. +class HistoryDynamicIFramesNavTestHandler : public TestHandler { + public: + HistoryDynamicIFramesNavTestHandler() + : nav_(-1) {} + + void RunTest() override { + // Add the resources that we will navigate to/from. + AddResource(kDynIfrNav1, + "" + " " + " Nav1" + " " + " " + " " + " Nav1 " + " " + "", + "text/html"); + AddResource(kDynIfrNav2, + "Nav2Nav2", + "text/html"); + + // Create the browser. + CreateBrowser(CefString()); + + // Time out the test after a reasonable period of time. + SetTestTimeout(); + } + + void RunNav(CefRefPtr browser) { + EXPECT_LE(nav_, 3); + EXPECT_FALSE(got_load_start_[nav_]); + EXPECT_FALSE(got_load_end_[nav_]); + + if (nav_ == 0) { + browser->GetMainFrame()->LoadURL(kDynIfrNav1); + } else if (nav_ == 1) { + browser->GetMainFrame()->LoadURL(kDynIfrNav2); + } else if (nav_ == 2) { + browser->GoBack(); + } else if (nav_ == 3) { + browser->Reload(); + } + } + + void OnAfterCreated(CefRefPtr browser) override { + TestHandler::OnAfterCreated(browser); + + nav_ = 0; + RunNav(browser); + } + + void OnLoadStart(CefRefPtr browser, + CefRefPtr frame, + TransitionType transition_type) override { + if(!frame->IsMain()) + return; + got_load_start_[nav_].yes(); + } + + void OnLoadEnd(CefRefPtr browser, + CefRefPtr frame, + int httpStatusCode) override { + if (!frame->IsMain()) + return; + CefString url = browser->GetMainFrame()->GetURL(); + got_load_end_[nav_].yes(); + + if(nav_ == 3) { + CefString url = browser->GetMainFrame()->GetURL(); + EXPECT_STREQ(url.ToString().c_str(), kDynIfrNav1); + DestroyTest(); + return; + } + + nav_++; + RunNav(browser); + } + + int nav_; + TrackCallback got_load_start_[4]; + TrackCallback got_load_end_[4]; + + IMPLEMENT_REFCOUNTING(HistoryDynamicIFramesNavTestHandler); +}; + +} // namespace + +// Verify history navigation of pages containing dynamically created iframes. +// See issue #2022 for background. +TEST(NavigationTest, HistoryDynamicIFrames) { + g_history_dynamic_iframes_nav_test = true; + CefRefPtr handler = + new HistoryDynamicIFramesNavTestHandler(); + handler->ExecuteTest(); + g_history_dynamic_iframes_nav_test = false; + + for (int i = 0; i < 4; ++i) { + EXPECT_TRUE(handler->got_load_start_[i]); + EXPECT_TRUE(handler->got_load_end_[i]); + } + + ReleaseAndWaitForDestructor(handler); +} + + namespace { const char kRNav1[] = "http://tests/nav1.html";