From 0f712430a6747668f22f8d617590e8057c28180b Mon Sep 17 00:00:00 2001 From: Dries Buytaert Date: Thu, 25 Feb 2010 08:58:31 +0000 Subject: - Patch #721536 by JacobSingh: fixed inline Javascript not working due to unescaped CDATA element created by saveXML(). --- modules/filter/filter.module | 42 ++++++++++++++++++++++++++++++++++++++++++ modules/filter/filter.test | 21 +++++++++++++++++++++ 2 files changed, 63 insertions(+) (limited to 'modules') diff --git a/modules/filter/filter.module b/modules/filter/filter.module index 01974868f..563bdb5b7 100644 --- a/modules/filter/filter.module +++ b/modules/filter/filter.module @@ -819,12 +819,54 @@ function filter_dom_load($text) { function filter_dom_serialize($dom_document) { $body_node = $dom_document->getElementsByTagName('body')->item(0); $body_content = ''; + + foreach($body_node->getElementsByTagName('script') as $node) { + filter_dom_serialize_escape_cdata_element($dom_document, $node); + } + + foreach($body_node->getElementsByTagName('style') as $node) { + filter_dom_serialize_escape_cdata_element($dom_document, $node, '/*', '*/'); + } + foreach ($body_node->childNodes as $child_node) { $body_content .= $dom_document->saveXML($child_node); } return preg_replace('|<([^>]*)/>|i', '<$1 />', $body_content); } +/** + * Adds comments around the childNodes as $node) { + if (get_class($node) == 'DOMCdataSection') { + // @see drupal_get_js(). This code is more or less duplicated there. + $embed_prefix = "\n{$comment_end}\n"; + $fragment = $dom_document->createDocumentFragment(); + $fragment->appendXML($embed_prefix . $node->data . $embed_suffix); + $dom_element->appendChild($fragment); + $dom_element->removeChild($node); + } + } +} + /** * Format a link to the more extensive filter tips. * diff --git a/modules/filter/filter.test b/modules/filter/filter.test index 64d3cb514..65e24e113 100644 --- a/modules/filter/filter.test +++ b/modules/filter/filter.test @@ -1065,6 +1065,27 @@ class FilterUnitTestCase extends DrupalUnitTestCase { $f = _filter_htmlcorrector('

دروبال'); $this->assertEqual($f, '

دروبال

', t('HTML corrector -- Encoding is correctly kept.')); + + $f = _filter_htmlcorrector(''); + $this->assertEqual($f, '', t('HTML corrector -- CDATA added to script element')); + + $f = _filter_htmlcorrector('

'); + $this->assertEqual($f, '

', t('HTML corrector -- CDATA added to a nested script element')); + + $f = _filter_htmlcorrector('

'); + $this->assertEqual($f, '

', t('HTML corrector -- CDATA added to a style element.')); } /** -- cgit v1.2.3