diff --git a/html/browsers/browsing-the-web/history-traversal/srcdoc/consecutive-srcdoc.html b/html/browsers/browsing-the-web/history-traversal/srcdoc/consecutive-srcdoc.html
new file mode 100644
index 00000000000000..9aab36b9862742
--- /dev/null
+++ b/html/browsers/browsing-the-web/history-traversal/srcdoc/consecutive-srcdoc.html
@@ -0,0 +1,85 @@
+
+
+
changing srcdoc to a different srcdoc
+
+
+
+
+
+
diff --git a/html/browsers/browsing-the-web/history-traversal/srcdoc/srcdoc-history-entries.html b/html/browsers/browsing-the-web/history-traversal/srcdoc/srcdoc-history-entries.html
new file mode 100644
index 00000000000000..09f4094c5f6eaa
--- /dev/null
+++ b/html/browsers/browsing-the-web/history-traversal/srcdoc/srcdoc-history-entries.html
@@ -0,0 +1,95 @@
+
+
+srcdoc history entries
+
+
+
+
+
+
diff --git a/html/browsers/browsing-the-web/resources/has-iframe.html b/html/browsers/browsing-the-web/resources/has-iframe.html
new file mode 100644
index 00000000000000..e6dfba1011a971
--- /dev/null
+++ b/html/browsers/browsing-the-web/resources/has-iframe.html
@@ -0,0 +1,7 @@
+
+
+
diff --git a/html/browsers/browsing-the-web/resources/helpers.js b/html/browsers/browsing-the-web/resources/helpers.js
new file mode 100644
index 00000000000000..2a894fccccae1e
--- /dev/null
+++ b/html/browsers/browsing-the-web/resources/helpers.js
@@ -0,0 +1,49 @@
+window.openWindow = (url, t) => {
+ const w = window.open(url);
+ t?.add_cleanup(() => w.close());
+
+ return new Promise(resolve => {
+ w.addEventListener("load", () => resolve(w), { once: true });
+ });
+};
+
+window.addIframe = (url = "/common/blank.html", doc = document) => {
+ const iframe = doc.createElement("iframe");
+ iframe.src = url;
+ doc.body.append(iframe);
+
+ return new Promise(resolve => {
+ iframe.addEventListener("load", () => resolve(iframe), { once: true });
+ });
+};
+
+window.waitToAvoidReplace = t => {
+ return new Promise(resolve => t.step_timeout(resolve, 0));
+};
+
+window.waitForMessage = expectedSource => {
+ return new Promise(resolve => {
+ window.addEventListener("message", ({ source, data }) => {
+ if (source === expectedSource) {
+ resolve(data);
+ }
+ });
+ });
+};
+
+window.waitForHashchange = w => {
+ return new Promise(resolve => {
+ w.addEventListener("hashchange", () => resolve(), { once: true });
+ });
+};
+
+window.srcdocThatPostsParentOpener = text => {
+ return `
+ ${text}
+