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";