diff --git a/packages/next/next-server/lib/router/router.ts b/packages/next/next-server/lib/router/router.ts
index 82b94f0307c85cc..3cc1ee2eae693bf 100644
--- a/packages/next/next-server/lib/router/router.ts
+++ b/packages/next/next-server/lib/router/router.ts
@@ -83,7 +83,21 @@ function fetchNextData(
// @ts-ignore __NEXT_DATA__
pathname: `/_next/data/${__NEXT_DATA__.buildId}${pathname}.json`,
query,
- })
+ }),
+ {
+ // Cookies are required to be present for Next.js' SSG "Preview Mode".
+ // Cookies may also be required for `getServerSideProps`.
+ //
+ // > `fetch` won’t send cookies, unless you set the credentials init
+ // > option.
+ // https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
+ //
+ // > For maximum browser compatibility when it comes to sending &
+ // > receiving cookies, always supply the `credentials: 'same-origin'`
+ // > option instead of relying on the default.
+ // https://github.com/github/fetch#caveats
+ credentials: 'same-origin',
+ }
).then(res => {
if (!res.ok) {
if (--attempts > 0 && res.status >= 500) {
diff --git a/test/integration/getserversideprops-preview/pages/to-index.js b/test/integration/getserversideprops-preview/pages/to-index.js
new file mode 100644
index 000000000000000..2979fa90b0b5d3b
--- /dev/null
+++ b/test/integration/getserversideprops-preview/pages/to-index.js
@@ -0,0 +1,15 @@
+import Link from 'next/link'
+
+export function getServerSideProps() {
+ return { props: {} }
+}
+
+export default function() {
+ return (
+
+
+ To Index
+
+
+ )
+}
diff --git a/test/integration/getserversideprops-preview/test/index.test.js b/test/integration/getserversideprops-preview/test/index.test.js
index 4bcf4bedf8bc0a7..6e94de5f0bb4d28 100644
--- a/test/integration/getserversideprops-preview/test/index.test.js
+++ b/test/integration/getserversideprops-preview/test/index.test.js
@@ -165,7 +165,7 @@ function runTests(startServer = nextStart) {
)
})
- it('should fetch preview data', async () => {
+ it('should fetch preview data on SSR', async () => {
await browser.get(`http://localhost:${appPort}/`)
await browser.waitForElementByCss('#props-pre')
// expect(await browser.elementById('props-pre').text()).toBe('Has No Props')
@@ -175,6 +175,18 @@ function runTests(startServer = nextStart) {
)
})
+ it('should fetch preview data on CST', async () => {
+ await browser.get(`http://localhost:${appPort}/to-index`)
+ await browser.waitForElementByCss('#to-index')
+ await browser.eval('window.itdidnotrefresh = "hello"')
+ await browser.elementById('to-index').click()
+ await browser.waitForElementByCss('#props-pre')
+ expect(await browser.eval('window.itdidnotrefresh')).toBe('hello')
+ expect(await browser.elementById('props-pre').text()).toBe(
+ 'true and {"client":"mode"}'
+ )
+ })
+
it('should fetch prerendered data', async () => {
await browser.get(`http://localhost:${appPort}/api/reset`)
diff --git a/test/integration/prerender-preview/pages/to-index.js b/test/integration/prerender-preview/pages/to-index.js
new file mode 100644
index 000000000000000..008f905005922be
--- /dev/null
+++ b/test/integration/prerender-preview/pages/to-index.js
@@ -0,0 +1,15 @@
+import Link from 'next/link'
+
+export function getStaticProps() {
+ return { props: {} }
+}
+
+export default function() {
+ return (
+
+
+ To Index
+
+
+ )
+}
diff --git a/test/integration/prerender-preview/test/index.test.js b/test/integration/prerender-preview/test/index.test.js
index 89e72e411be6d9a..52f5757e36d02ca 100644
--- a/test/integration/prerender-preview/test/index.test.js
+++ b/test/integration/prerender-preview/test/index.test.js
@@ -165,7 +165,7 @@ function runTests(startServer = nextStart) {
)
})
- it('should fetch preview data', async () => {
+ it('should fetch preview data on SSR', async () => {
await browser.get(`http://localhost:${appPort}/`)
await browser.waitForElementByCss('#props-pre')
// expect(await browser.elementById('props-pre').text()).toBe('Has No Props')
@@ -175,6 +175,18 @@ function runTests(startServer = nextStart) {
)
})
+ it('should fetch preview data on CST', async () => {
+ await browser.get(`http://localhost:${appPort}/to-index`)
+ await browser.waitForElementByCss('#to-index')
+ await browser.eval('window.itdidnotrefresh = "hello"')
+ await browser.elementById('to-index').click()
+ await browser.waitForElementByCss('#props-pre')
+ expect(await browser.eval('window.itdidnotrefresh')).toBe('hello')
+ expect(await browser.elementById('props-pre').text()).toBe(
+ 'true and {"client":"mode"}'
+ )
+ })
+
it('should fetch prerendered data', async () => {
await browser.get(`http://localhost:${appPort}/api/reset`)