From 0249adf3db4e6147c9689d4ecb3d4dfc4344d43e Mon Sep 17 00:00:00 2001 From: Eric O'Connell Date: Wed, 8 Jul 2015 20:31:10 -0700 Subject: [PATCH 1/5] Handle escaping when comparing server/client markup --- src/renderers/dom/client/ReactMount.js | 8 ++++++-- .../dom/client/__tests__/ReactMount-test.js | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/renderers/dom/client/ReactMount.js b/src/renderers/dom/client/ReactMount.js index 3aadb2f9b64..758f7ee6b8c 100644 --- a/src/renderers/dom/client/ReactMount.js +++ b/src/renderers/dom/client/ReactMount.js @@ -880,9 +880,13 @@ var ReactMount = { checksum ); - var diffIndex = firstDifferenceIndex(markup, rootMarkup); + var normalizer = document.createElement('div'); + normalizer.innerHTML = markup; + var normalizedMarkup = normalizer.innerHTML; + + var diffIndex = firstDifferenceIndex(normalizedMarkup, rootMarkup); var difference = ' (client) ' + - markup.substring(diffIndex - 20, diffIndex + 20) + + normalizedMarkup.substring(diffIndex - 20, diffIndex + 20) + '\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20); invariant( diff --git a/src/renderers/dom/client/__tests__/ReactMount-test.js b/src/renderers/dom/client/__tests__/ReactMount-test.js index d5700df411b..ea875eb38f9 100644 --- a/src/renderers/dom/client/__tests__/ReactMount-test.js +++ b/src/renderers/dom/client/__tests__/ReactMount-test.js @@ -16,6 +16,7 @@ var mocks = require('mocks'); describe('ReactMount', function() { var React = require('React'); var ReactMount = require('ReactMount'); + var ReactMarkupChecksum = require('ReactMarkupChecksum'); var ReactTestUtils = require('ReactTestUtils'); var WebComponents = WebComponents; @@ -156,6 +157,22 @@ describe('ReactMount', function() { ); }); + it('should account for escaping on a checksum mismatch', function () { + var div = document.createElement('div'); + var markup = React.renderToString( +
This markup contains an html entity: & server text
); + div.innerHTML = markup; + + spyOn(console, 'error'); + React.render( +
This markup contains an html entity: & client text
, div); + expect(console.error.calls.length).toBe(1); + expect(console.error.calls[0].args[0]).toContain( + ' (client) html entity: & client text\n' + + ' (server) html entity: & server text' + ) + }); + if (WebComponents !== undefined) { it('should allow mounting/unmounting to document fragment container', function() { From 1316160b866f7e34506910313338fabafb9defc3 Mon Sep 17 00:00:00 2001 From: Eric O'Connell Date: Thu, 9 Jul 2015 11:48:42 -0700 Subject: [PATCH 2/5] Properly handle rendering into document when comparing markup --- src/renderers/dom/client/ReactMount.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/renderers/dom/client/ReactMount.js b/src/renderers/dom/client/ReactMount.js index 758f7ee6b8c..f2f9f262b4c 100644 --- a/src/renderers/dom/client/ReactMount.js +++ b/src/renderers/dom/client/ReactMount.js @@ -880,9 +880,20 @@ var ReactMount = { checksum ); - var normalizer = document.createElement('div'); - normalizer.innerHTML = markup; - var normalizedMarkup = normalizer.innerHTML; + // because rootMarkup is retrieved from the DOM, various normalizations + // will have occurred which will not be present in `markup`. Here, + // insert markup into a
or