diff --git a/packages/next/client/image.tsx b/packages/next/client/image.tsx index d8f3a21ae8afe88..9608f3981ac04da 100644 --- a/packages/next/client/image.tsx +++ b/packages/next/client/image.tsx @@ -343,7 +343,7 @@ export default function Image({ let isLazy = !priority && (loading === 'lazy' || typeof loading === 'undefined') - if (src.startsWith('data:')) { + if (src.startsWith('data:') || src.startsWith('blob:')) { // https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs unoptimized = true isLazy = false diff --git a/test/integration/image-component/default/pages/blob.js b/test/integration/image-component/default/pages/blob.js new file mode 100644 index 000000000000000..7fd386f30eaa705 --- /dev/null +++ b/test/integration/image-component/default/pages/blob.js @@ -0,0 +1,26 @@ +import React, { useEffect, useState } from 'react' +import Image from 'next/image' + +const Page = () => { + const [src, setSrc] = useState() + + useEffect(() => { + fetch('/test.jpg') + .then((res) => { + return res.blob() + }) + .then((blob) => { + const url = URL.createObjectURL(blob) + setSrc(url) + }) + }, []) + + return ( +
+

Blob URL

+ {src ? : null} +
+ ) +} + +export default Page diff --git a/test/integration/image-component/default/test/index.test.js b/test/integration/image-component/default/test/index.test.js index f2fbccb4132802d..aff13d076e6ff2c 100644 --- a/test/integration/image-component/default/test/index.test.js +++ b/test/integration/image-component/default/test/index.test.js @@ -229,6 +229,26 @@ function runTests(mode) { } }) + it('should work with image with blob src', async () => { + let browser + try { + browser = await webdriver(appPort, '/blob') + + await check( + () => browser.eval(`document.getElementById("blob-image").src`), + /^blob:/ + ) + await check( + () => browser.eval(`document.getElementById("blob-image").srcset`), + '' + ) + } finally { + if (browser) { + await browser.close() + } + } + }) + it('should work when using flexbox', async () => { let browser try {