Index: /CKEditor/trunk/_source/core/dtd.js
===================================================================
--- /CKEditor/trunk/_source/core/dtd.js	(revision 3495)
+++ /CKEditor/trunk/_source/core/dtd.js	(revision 3496)
@@ -68,4 +68,6 @@
 
 		$body : X({script:1}, block),
+
+		$cdata : {script:1,style:1},
 
 		/**
Index: /CKEditor/trunk/_source/core/htmlparser.js
===================================================================
--- /CKEditor/trunk/_source/core/htmlparser.js	(revision 3495)
+++ /CKEditor/trunk/_source/core/htmlparser.js	(revision 3496)
@@ -74,4 +74,18 @@
 
 		/**
+		 * Function to be fired when CDATA section is found. This function
+		 * should be overriden when using this class.
+		 * @param {String} cdata The CDATA been found.
+		 * @example
+		 * var parser = new CKEDITOR.htmlParser();
+		 * parser.onCDATA = function( cdata )
+		 *     {
+		 *         alert( cdata );  // e.g. "var hello;"
+		 *     });
+		 * parser.parse( "&lt;script&gt;var hello;&lt;/script&gt;" );
+		 */
+		onCDATA		: function() {},
+
+		/**
 		 * Function to be fired when a commend is found. This function
 		 * should be overriden when using this class.
@@ -102,5 +116,6 @@
 			var parts,
 				tagName,
-				nextIndex = 0;
+				nextIndex = 0,
+				cdata;	// The collected data inside a CDATA section.
 
 			while ( ( parts = this._.htmlPartsRegex.exec( html ) ) )
@@ -108,5 +123,12 @@
 				var tagIndex = parts.index;
 				if ( tagIndex > nextIndex )
-					this.onText( html.substring( nextIndex, tagIndex ) );
+				{
+					var text = html.substring( nextIndex, tagIndex );
+
+					if ( cdata )
+						cdata.push( text );					
+					else
+						this.onText( text );
+				}
 
 				nextIndex = this._.htmlPartsRegex.lastIndex;
@@ -114,5 +136,5 @@
 				/*
 				 "parts" is an array with the following items:
-					0 : The entire match (not used)
+					0 : The entire match for opening/closing tags and comments.
 					1 : Group filled with the tag name for closing tags.
 					2 : Group filled with the comment text.
@@ -124,5 +146,24 @@
 				if ( ( tagName = parts[ 1 ] ) )
 				{
-					this.onTagClose( tagName.toLowerCase() );
+					tagName = tagName.toLowerCase();
+
+					if ( cdata && CKEDITOR.dtd.$cdata[ tagName ] )
+					{
+						// Send the CDATA data.
+						this.onCDATA( cdata.join('') );
+						cdata = null;
+					}
+
+					if ( !cdata )
+					{
+						this.onTagClose( tagName );
+						continue;
+					}
+				}
+
+				// If CDATA is enabled, just save the raw match.
+				if ( cdata )
+				{
+					cdata.push( parts[ 0 ] );
 					continue;
 				}
@@ -151,4 +192,9 @@
 
 					this.onTagOpen( tagName.toLowerCase(), attribs, selfClosing );
+
+					// Open CDATA mode when finding the appropriate tags.
+					if ( !cdata && CKEDITOR.dtd.$cdata[ tagName ] )
+						cdata = [];
+
 					continue;
 				}
Index: /CKEditor/trunk/_source/core/htmlparser/cdata.js
===================================================================
--- /CKEditor/trunk/_source/core/htmlparser/cdata.js	(revision 3496)
+++ /CKEditor/trunk/_source/core/htmlparser/cdata.js	(revision 3496)
@@ -0,0 +1,44 @@
+/*
+Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function()
+{
+
+	/**
+	 * A lightweight representation of HTML text.
+	 * @constructor
+	 * @example
+	 */
+	CKEDITOR.htmlParser.cdata = function( value )
+	{
+		/**
+		 * The CDATA value.
+		 * @type String
+		 * @example
+		 */
+		this.value = value;
+
+	};
+
+	CKEDITOR.htmlParser.cdata.prototype =
+	{
+		/**
+		 * CDATA has the same type as {@link CKEDITOR.htmlParser.text} This is
+		 * a constant value set to {@link CKEDITOR.NODE_TEXT}.
+		 * @type Number
+		 * @example
+		 */
+		type : CKEDITOR.NODE_TEXT,
+
+		/**
+		 * Writes write the CDATA with no special manipulations.
+		 * @param {CKEDITOR.htmlWriter} writer The writer to which write the HTML.
+		 */
+		writeHtml : function( writer )
+		{
+			writer.write( this.value ); 
+		}
+	};
+})();
Index: /CKEditor/trunk/_source/core/htmlparser/fragment.js
===================================================================
--- /CKEditor/trunk/_source/core/htmlparser/fragment.js	(revision 3495)
+++ /CKEditor/trunk/_source/core/htmlparser/fragment.js	(revision 3496)
@@ -290,4 +290,9 @@
 		};
 
+		parser.onCDATA = function( cdata )
+		{
+			currentNode.add( new CKEDITOR.htmlParser.cdata( cdata ) );
+		};
+
 		parser.onComment = function( comment )
 		{
Index: /CKEditor/trunk/_source/core/loader.js
===================================================================
--- /CKEditor/trunk/_source/core/loader.js	(revision 3495)
+++ /CKEditor/trunk/_source/core/loader.js	(revision 3496)
@@ -54,6 +54,7 @@
 			'core/htmlparser/comment'	: [ 'core/htmlparser' ],
 			'core/htmlparser/element'	: [ 'core/htmlparser', 'core/htmlparser/fragment' ],
-			'core/htmlparser/fragment'	: [ 'core/htmlparser', 'core/htmlparser/comment', 'core/htmlparser/text' ],
+			'core/htmlparser/fragment'	: [ 'core/htmlparser', 'core/htmlparser/comment', 'core/htmlparser/text', 'core/htmlparser/cdata' ],
 			'core/htmlparser/text'		: [ 'core/htmlparser' ],
+			'core/htmlparser/cdata'		: [ 'core/htmlparser' ],
 			'core/htmlparser/filter'	: [ 'core/htmlparser' ],
 			'core/htmlparser/basicwriter': [ 'core/htmlparser' ],
Index: /CKEditor/trunk/_source/tests/core/htmlparser/fragment.html
===================================================================
--- /CKEditor/trunk/_source/tests/core/htmlparser/fragment.html	(revision 3495)
+++ /CKEditor/trunk/_source/tests/core/htmlparser/fragment.html	(revision 3496)
@@ -146,4 +146,10 @@
 		},
 
+		test_ticket_3441 : function()
+		{
+			testParser(	'<p><b>Test</b></p><script type="test">var a = "<A Href=xxx>Testing</ A>";\nGo();<\/script>',
+						'<p><b>Test</b></p><script type="test">var a = "<A Href=xxx>Testing</ A>";\nGo();<\/script>' );
+		},
+
 		name : document.title
 	};
