From f8ac921e8bba47b9a26cd1ace6e646272bf1970a Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Mon, 6 Apr 2020 17:44:30 -0700 Subject: [PATCH 1/4] Filter certain DOM attributes (e.g. src, href) if their values are empty strings This prevents e.g. from making an unnecessar HTTP request for certain browsers. --- .../src/__tests__/ReactDOMComponent-test.js | 87 +++++++++++++++++++ packages/react-dom/src/shared/DOMProperty.js | 36 +++++++- packages/shared/ReactFeatureFlags.js | 4 + .../forks/ReactFeatureFlags.native-fb.js | 1 + .../forks/ReactFeatureFlags.native-oss.js | 1 + .../forks/ReactFeatureFlags.test-renderer.js | 1 + .../ReactFeatureFlags.test-renderer.www.js | 1 + .../shared/forks/ReactFeatureFlags.testing.js | 1 + .../forks/ReactFeatureFlags.testing.www.js | 1 + .../forks/ReactFeatureFlags.www-dynamic.js | 1 + .../shared/forks/ReactFeatureFlags.www.js | 1 + 11 files changed, 134 insertions(+), 1 deletion(-) diff --git a/packages/react-dom/src/__tests__/ReactDOMComponent-test.js b/packages/react-dom/src/__tests__/ReactDOMComponent-test.js index a25d8f9eff4c..c31709884641 100644 --- a/packages/react-dom/src/__tests__/ReactDOMComponent-test.js +++ b/packages/react-dom/src/__tests__/ReactDOMComponent-test.js @@ -445,6 +445,93 @@ describe('ReactDOMComponent', () => { expect(node.hasAttribute('data-foo')).toBe(false); }); + if (ReactFeatureFlags.enableFilterEmptyStringAttributesDOM) { + it('should not add an empty src attribute', () => { + const container = document.createElement('div'); + expect(() => ReactDOM.render(, container)).toErrorDev( + 'Invalid value "" (empty string) for attribute `src`.', + ); + const node = container.firstChild; + expect(node.hasAttribute('src')).toBe(false); + + ReactDOM.render(, container); + expect(node.hasAttribute('src')).toBe(true); + + expect(() => ReactDOM.render(, container)).toErrorDev( + 'Invalid value "" (empty string) for attribute `src`.', + ); + expect(node.hasAttribute('src')).toBe(false); + }); + + it('should not add an empty href attribute', () => { + const container = document.createElement('div'); + expect(() => ReactDOM.render(, container)).toErrorDev( + 'Invalid value "" (empty string) for attribute `href`.', + ); + const node = container.firstChild; + expect(node.hasAttribute('href')).toBe(false); + + ReactDOM.render(, container); + expect(node.hasAttribute('href')).toBe(true); + + expect(() => ReactDOM.render(, container)).toErrorDev( + 'Invalid value "" (empty string) for attribute `href`.', + ); + expect(node.hasAttribute('href')).toBe(false); + }); + + it('should not add an empty action attribute', () => { + const container = document.createElement('div'); + expect(() => ReactDOM.render(
, container)).toErrorDev( + 'Invalid value "" (empty string) for attribute `action`.', + ); + const node = container.firstChild; + expect(node.hasAttribute('action')).toBe(false); + + ReactDOM.render(, container); + expect(node.hasAttribute('action')).toBe(true); + + expect(() => ReactDOM.render(, container)).toErrorDev( + 'Invalid value "" (empty string) for attribute `action`.', + ); + expect(node.hasAttribute('action')).toBe(false); + }); + + it('should not add an empty formAction attribute', () => { + const container = document.createElement('div'); + expect(() => + ReactDOM.render(