diff --git a/Doxyfile b/Doxyfile index 9076573d..044217be 100644 --- a/Doxyfile +++ b/Doxyfile @@ -4,7 +4,7 @@ # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = HTML Purifier -PROJECT_NUMBER = 2.1.1 +PROJECT_NUMBER = 2.1.2 OUTPUT_DIRECTORY = "C:/Documents and Settings/Edward/My Documents/My Webs/htmlpurifier/docs/doxygen" CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English diff --git a/NEWS b/NEWS index 04bfa37d..212edc94 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,34 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier . Internal change ========================== +2.1.2, released 2007-09-03 +! Implemented Object module for trusted users +! Implemented experimental HTML5 parsing mode using PH5P. To use, add + this to your code: + require_once 'HTMLPurifier/Lexer/PH5P.php'; + $config->set('Core', 'LexerImpl', 'PH5P'); + Note that this Lexer introduces some classes not in the HTMLPurifier + namespace. Also, this is PHP5 only. +! CSS property border-spacing implemented +- Fix non-visible parsing error in DirectLex with empty tags that have + slashes inside attribute values. +- Fix typo in CSS definition: border-collapse:seperate; was incorrectly + accepted as valid CSS. Usually non-visible, because this styling is the + default for tables in most browsers. Thanks Brett Zamir for pointing + this out. +- Fix validation errors in configuration form +- Hammer out a bunch of edge-case bugs in the standalone distribution +- Inclusion reflection removed from URISchemeRegistry; you must manually + include any new schema files you wish to use +- Numerous typo fixes in documentation thanks to Brett Zamir +. Unit test refactoring for one logical test per test function +. Config and context parameters in ComplexHarness deprecated: instead, edit + the $config and $context member variables +. HTML wrapper in DOMLex now takes DTD identifiers into account; doesn't + really make a difference, but is good for completeness sake +. merge-library.php script refactored for greater code reusability and + PHP4 compatibility + 2.1.1, released 2007-08-04 - Fix show-stopper bug in %URI.MakeAbsolute functionality - Fix PHP4 syntax error in standalone version diff --git a/TODO b/TODO index 0fa3eb08..0c0a5669 100644 --- a/TODO +++ b/TODO @@ -28,23 +28,22 @@ afraid to cast your vote for the next feature to be implemented! - Remove empty inline tags - Append something to duplicate IDs so they're still usable (impl. note: the dupe detector would also need to detect the suffix as well) + - Externalize inline CSS to promote clean HTML 2.4 release [It's All About Trust] (floating) # Implement untrusted, dangerous elements/attributes # Implement IDREF support (harder than it seems, since you cannot have IDREFs to non-existent IDs) + # Frameset XHTML 1.0 and HTML 4.01 doctypes 3.0 release [Beyond HTML] # Legit token based CSS parsing (will require revamping almost every - AttrDef class) + AttrDef class). Probably will use CSSTidy class # More control over allowed CSS properties (maybe modularize it in the same fashion!) # Formatters for plaintext - Smileys - Standardize token armor for all areas of processing - - Fixes for Firefox's inability to handle COL alignment props (Bug 915) - - Automatically add non-breaking spaces to empty table cells when - empty-cells:show is applied to have compatibility with Internet Explorer - Convert RTL/LTR override characters to tags, or vice versa on demand. Also, enable disabling of directionality @@ -63,25 +62,27 @@ Ongoing - Complete basic smoketests Unknown release (on a scratch-an-itch basis) - ? Semi-lossy dumb alternate character encoding transfor + # CHMOD install script for PEAR installs ? Have 'lang' attribute be checked against official lists, achieved by encoding all characters that have string entity equivalents - Abstract ChildDef_BlockQuote to work with all elements that only allow blocks in them, required or optional - Reorganize Unit Tests - - Refactor loop tests: Lexer - Reorganize configuration directives (Create more namespaces! Get messy!) - Advanced URI filtering schemes (see docs/proposal-new-directives.txt) - Implement lenient child validation - Explain how to use HTML Purifier in non-PHP languages / create a simple command line stub (or complicated?) + - Fixes for Firefox's inability to handle COL alignment props (Bug 915) + - Automatically add non-breaking spaces to empty table cells when + empty-cells:show is applied to have compatibility with Internet Explorer Requested Wontfix - Non-lossy smart alternate character encoding transformations (unless patch provided) - - Pretty-printing HTML, users can use Tidy on the output on entire page + - Pretty-printing HTML: users can use Tidy on the output on entire page - Native content compression, whitespace stripping (don't rely on Tidy, make sure we don't remove from
 or related tags): use gzip if this is
    really important
diff --git a/VERSION b/VERSION
index 7c327287..8f9174b4 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.1.1
\ No newline at end of file
+2.1.2
\ No newline at end of file
diff --git a/WHATSNEW b/WHATSNEW
index a08edbb5..e9a40184 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -1,10 +1,8 @@
-In version 2.1, HTML Purifier's URI validation and filtering handling
-system has been revamped with a new, extensible URIFilter system. Also
-notable features include preservation of emoticons in PHP5 with
-%Core.AggressivelyFixLt, standalone and lite download versions,
-transforming relative URIs to absolute URIs, Ruby in XHTML 1.1, a Phorum
-mod, and UTF-8 font names.  Notable bug-fixes include refinement of
-the auto-paragraphing algorithm (no longer experimental), better XHTML
-1.1 support and the removal of the contents of ',
             ''
         );
-        
+    }
+    
+    function testRemoveOnlyScriptTagsLegacy() {
+        $this->config->set('Core', 'RemoveScriptContents', false);
         $this->assertResult(
             '',
-            'alert();',
-            array('Core.RemoveScriptContents' => false)
+            'alert();'
         );
-        
+    }
+    
+    function testRemoveOnlyScriptTags() {
+        $this->config->set('Core', 'HiddenElements', array());
         $this->assertResult(
             '',
-            'alert();',
-            array('Core.HiddenElements' => array())
+            'alert();'
         );
-        
-        $this->assertResult(
-            '
  • Item 1
  • ', - '
    • Item 1
    ' - ); - - // test center transform - $this->assertResult( - '
    Look I am Centered!
    ', - '
    Look I am Centered!
    ' - ); - - // test font transform - $this->assertResult( - 'Big Warning!', - 'Big'. - ' Warning!' - ); - - // test removal of invalid img tag - $this->assertResult( - '', - '' - ); - - // test preservation of valid img tag + } + + function testRemoveInvalidImg() { + $this->assertResult('', ''); + } + + function testPreserveValidImg() { $this->assertResult('foobar.gif'); - - // test preservation of invalid img tag when removal is disabled - $this->assertResult( - '', - true, - array( - 'Core.RemoveInvalidImg' => false - ) - ); - - // test transform to unallowed element - $this->assertResult( - 'Big Warning!', - 'Big Warning!', - array('HTML.Allowed' => 'div') - ); - - // text-ify commented script contents ( the trailing comment gets - // removed during generation ) + } + + function testPreserveInvalidImgWhenRemovalIsDisabled() { + $this->config->set('Core', 'RemoveInvalidImg', false); + $this->assertResult(''); + } + + function testTextifyCommentedScriptContents() { + $this->config->set('HTML', 'Trusted', true); + $this->config->set('Output', 'CommentScriptContents', false); // simplify output $this->assertResult( '', '', - array('HTML.Trusted' => true, 'Output.CommentScriptContents' => false) +// ' ); - } } diff --git a/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php b/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php new file mode 100644 index 00000000..8071d2ab --- /dev/null +++ b/tests/HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php @@ -0,0 +1,46 @@ +obj = new HTMLPurifier_Strategy_RemoveForeignElements(); + $this->config->set('HTML', 'TidyLevel', 'heavy'); + } + + function testCenterTransform() { + $this->assertResult( + '
    Look I am Centered!
    ', + '
    Look I am Centered!
    ' + ); + } + + function testFontTransform() { + $this->assertResult( + 'Big Warning!', + 'Big'. + ' Warning!' + ); + } + + function testTransformToForbiddenElement() { + $this->config->set('HTML', 'Allowed', 'div'); + $this->assertResult( + 'Big Warning!', + 'Big Warning!' + ); + } + + function testMenuTransform() { + $this->assertResult( + '
  • Item 1
  • ', + '
    • Item 1
    ' + ); + } + +} diff --git a/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php b/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php index fc7de460..25359425 100644 --- a/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php +++ b/tests/HTMLPurifier/Strategy/ValidateAttributesTest.php @@ -1,6 +1,5 @@ obj = new HTMLPurifier_Strategy_ValidateAttributes(); - $this->config = array('HTML.Doctype' => 'XHTML 1.0 Strict'); } - function testEmpty() { + function testEmptyInput() { $this->assertResult(''); } - function testIDs() { + function testRemoveIDByDefault() { $this->assertResult( '
    Kill the ID.
    ', '
    Kill the ID.
    ' ); - - $this->assertResult('
    Preserve the ID.
    ', true, - array('HTML.EnableAttrID' => true)); - - $this->assertResult( - '
    Kill the ID.
    ', - '
    Kill the ID.
    ', - array('HTML.EnableAttrID' => true) - ); - - // test id accumulator - $this->assertResult( - '
    Valid
    Invalid
    ', - '
    Valid
    Invalid
    ', - array('HTML.EnableAttrID' => true) - ); - + } + + function testRemoveInvalidDir() { $this->assertResult( 'Bad dir.', 'Bad dir.' ); - - // test attribute key case sensitivity - $this->assertResult( - '
    Convert ID to lowercase.
    ', - '
    Convert ID to lowercase.
    ', - array('HTML.EnableAttrID' => true) - ); - - // test simple attribute substitution - $this->assertResult( - '
    Trim whitespace.
    ', - '
    Trim whitespace.
    ', - array('HTML.EnableAttrID' => true) - ); - - // test configuration id blacklist - $this->assertResult( - '
    Invalid
    ', - '
    Invalid
    ', - array( - 'Attr.IDBlacklist' => array('invalid'), - 'HTML.EnableAttrID' => true - ) - ); - - // name rewritten as id - $this->assertResult( - '', - '', - array('HTML.EnableAttrID' => true) - ); } - function testClasses() { + function testPreserveValidClass() { $this->assertResult('
    Valid
    '); - + } + + function testSelectivelyRemoveInvalidClasses() { $this->assertResult( '
    Keep valid.
    ', '
    Keep valid.
    ' ); } - function testTitle() { + function testPreserveTitle() { $this->assertResult( 'PHP' ); } - function testLang() { + function testAddXMLLang() { $this->assertResult( 'La soupe.', 'La soupe.' ); - - // test only xml:lang for XHTML 1.1 + } + + function testOnlyXMLLangInXHTML11() { + $this->config->set('HTML', 'Doctype', 'XHTML 1.1'); $this->assertResult( 'asdf', - 'asdf', array('HTML.Doctype' => 'XHTML 1.1') + 'asdf' ); } - function testAlign() { - - $this->assertResult( - '

    Centered Headline

    ', - '

    Centered Headline

    ' - ); - $this->assertResult( - '

    Right-aligned Headline

    ', - '

    Right-aligned Headline

    ' - ); - $this->assertResult( - '

    Left-aligned Headline

    ', - '

    Left-aligned Headline

    ' - ); - $this->assertResult( - '

    Justified Paragraph

    ', - '

    Justified Paragraph

    ' - ); - $this->assertResult( - '

    Invalid Headline

    ', - '

    Invalid Headline

    ' - ); - + function testBasicURI() { + $this->assertResult('
    Google'); } - function testTable() { + function testInvalidURI() { + $this->assertResult( + 'Google', + 'Google' + ); + } + + function testBdoAddMissingDir() { + $this->assertResult( + 'Go left.', + 'Go left.' + ); + } + + function testBdoReplaceInvalidDirWithDefault() { + $this->assertResult( + 'Invalid value!', + 'Invalid value!' + ); + } + + function testBdoAlternateDefaultDir() { + $this->config->set('Attr', 'DefaultTextDir', 'rtl'); + $this->assertResult( + 'Go right.', + 'Go right.' + ); + } + + function testRemoveDirWhenNotRequired() { + $this->assertResult( + 'Invalid value!', + 'Invalid value!' + ); + } + + function testTableAttributes() { $this->assertResult( '@@ -148,293 +120,64 @@ class HTMLPurifier_Strategy_ValidateAttributesTest extends
    ' ); - - // test col.span is non-zero + } + + function testColSpanIsNonZero() { $this->assertResult( '', '' ); - // lengths - $this->assertResult( - '
    ', - '
    ' - ); - // td boolean transformation - $this->assertResult( - '', - '' - ); - - // caption align transformation - $this->assertResult( - '', - '' - ); - $this->assertResult( - '', - '' - ); - $this->assertResult( - '', - '' - ); - $this->assertResult( - '', - '' - ); - $this->assertResult( - '', - '' - ); - - // align transformation - $this->assertResult( - '', - '
    ' - ); - $this->assertResult( - '
    ', - '
    ' - ); - $this->assertResult( - '
    ', - '
    ' - ); - $this->assertResult( - '
    ', - '
    ' - ); } - function testURI() { - $this->assertResult('Google'); - - // test invalid URI - $this->assertResult( - 'Google', - 'Google' - ); - } - - function testImg() { + function testImgAddDefaults() { + $this->config->set('Core', 'RemoveInvalidImg', false); $this->assertResult( '', - 'Invalid image', - array('Core.RemoveInvalidImg' => false) + 'Invalid image' ); - + } + + function testImgGenerateAlt() { $this->assertResult( '', 'foobar.jpg' ); - + } + + function testImgAddDefaultSrc() { + $this->config->set('Core', 'RemoveInvalidImg', false); $this->assertResult( 'pretty picture', - 'pretty picture', - array('Core.RemoveInvalidImg' => false) + 'pretty picture' ); - // mailto in image is not allowed + } + + function testImgRemoveNonRetrievableProtocol() { + $this->config->set('Core', 'RemoveInvalidImg', false); $this->assertResult( '', - 'mailto:foo@example.com', - array('Core.RemoveInvalidImg' => false) - ); - // align transformation - $this->assertResult( - 'foobar', - 'foobar' - ); - $this->assertResult( - 'foobar', - 'foobar' - ); - $this->assertResult( - 'foobar', - 'foobar' - ); - $this->assertResult( - 'foobar', - 'foobar' - ); - $this->assertResult( - 'foobar', - 'foobar' - ); - $this->assertResult( - 'foobar', - 'foobar' - ); - - } - - function testBdo() { - // test required attributes for bdo - $this->assertResult( - 'Go left.', - 'Go left.' - ); - - $this->assertResult( - 'Invalid value!', - 'Invalid value!' + 'mailto:foo@example.com' ); } - function testDir() { - // see testBdo, behavior is subtly different - $this->assertResult( - 'Invalid value!', - 'Invalid value!' - ); + function testPreserveRel() { + $this->config->set('Attr', 'AllowedRel', 'nofollow'); + $this->assertResult(''); } - - function testLinks() { - // link types - $this->assertResult( - '', - true, - array('Attr.AllowedRel' => 'nofollow') - ); - // link targets - $this->assertResult( - '', - true, - array('Attr.AllowedFrameTargets' => '_top', - 'HTML.Doctype' => 'XHTML 1.0 Transitional') - ); + + function testPreserveTarget() { + $this->config->set('Attr', 'AllowedFrameTargets', '_top'); + $this->config->set('HTML', 'Doctype', 'XHTML 1.0 Transitional'); + $this->assertResult(''); + } + + function testRemoveTargetWhenNotSupported() { + $this->config->set('HTML', 'Doctype', 'XHTML 1.0 Strict'); + $this->config->set('Attr', 'AllowedFrameTargets', '_top'); $this->assertResult( '', '' ); - $this->assertResult( - '', - '', - array('Attr.AllowedFrameTargets' => '_top', 'HTML.Strict' => true) - ); - } - - function testBorder() { - // border - $this->assertResult( - 'foo', - 'foo', - array('Attr.AllowedRel' => 'nofollow') - ); - } - - function testHr() { - $this->assertResult( - '
    ', - '
    ' - ); - $this->assertResult( - '
    ', - '
    ' - ); - // align transformation - $this->assertResult( - '
    ', - '
    ' - ); - $this->assertResult( - '
    ', - '
    ' - ); - $this->assertResult( - '
    ', - '
    ' - ); - $this->assertResult( - '
    ', - '
    ' - ); - } - - function testBr() { - // br clear transformation - $this->assertResult( - '
    ', - '
    ' - ); - $this->assertResult( - '
    ', - '
    ' - ); - $this->assertResult( // test both? - '
    ', - '
    ' - ); - $this->assertResult( - '
    ', - '
    ' - ); - $this->assertResult( - '
    ', - '
    ' - ); - } - - function testListTypeTransform() { - // ul - $this->assertResult( - '

    ', + '

    ' + ); + } + + function testTdConvertNowrap() { + $this->assertResult( + '
    ', + '' + ); + } + + function testCaptionConvertAlignLeft() { + $this->assertResult( + '
    ', + '' + ); + } + + function testCaptionConvertAlignRight() { + $this->assertResult( + '', + '' + ); + } + + function testCaptionConvertAlignTop() { + $this->assertResult( + '', + '' + ); + } + + function testCaptionConvertAlignBottom() { + $this->assertResult( + '', + '' + ); + } + + function testCaptionRemoveInvalidAlign() { + $this->assertResult( + '', + '' + ); + } + + function testTableConvertAlignLeft() { + $this->assertResult( + '', + '
    ' + ); + } + + function testTableConvertAlignCenter() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testTableConvertAlignRight() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testTableRemoveInvalidAlign() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testImgConvertAlignLeft() { + $this->assertResult( + 'foobar', + 'foobar' + ); + } + + function testImgConvertAlignRight() { + $this->assertResult( + 'foobar', + 'foobar' + ); + } + + function testImgConvertAlignBottom() { + $this->assertResult( + 'foobar', + 'foobar' + ); + } + + function testImgConvertAlignMiddle() { + $this->assertResult( + 'foobar', + 'foobar' + ); + } + + function testImgConvertAlignTop() { + $this->assertResult( + 'foobar', + 'foobar' + ); + } + + function testImgRemoveInvalidAlign() { + $this->assertResult( + 'foobar', + 'foobar' + ); + } + + function testBorderConvertHVSpace() { + $this->assertResult( + 'foo', + 'foo' + ); + } + + function testHrConvertSize() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testHrConvertNoshade() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testHrConvertAlignLeft() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testHrConvertAlignCenter() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testHrConvertAlignRight() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testHrRemoveInvalidAlign() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testBrConvertClearLeft() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testBrConvertClearRight() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testBrConvertClearAll() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testBrConvertClearNone() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testBrRemoveInvalidClear() { + $this->assertResult( + '
    ', + '
    ' + ); + } + + function testUlConvertTypeDisc() { + $this->assertResult( + '
      ', + '
        ' + ); + } + + function testUlConvertTypeSquare() { + $this->assertResult( + '
          ', + '
            ' + ); + } + + function testUlConvertTypeCircle() { + $this->assertResult( + '
              ', + '
                ' + ); + } + + function testUlConvertTypeCaseInsensitive() { + $this->assertResult( + '
                  ', + '
                    ' + ); + } + + function testUlRemoveInvalidType() { + $this->assertResult( + '
                      ', + '
                        ' + ); + } + + function testOlConvertType1() { + $this->assertResult( + '
                          ', + '
                            ' + ); + } + + function testOlConvertTypeLowerI() { + $this->assertResult( + '
                              ', + '
                                ' + ); + } + + function testOlConvertTypeUpperI() { + $this->assertResult( + '
                                  ', + '
                                    ' + ); + } + + function testOlConvertTypeLowerA() { + $this->assertResult( + '
                                      ', + '
                                        ' + ); + } + + function testOlConvertTypeUpperA() { + $this->assertResult( + '
                                          ', + '
                                            ' + ); + } + + function testOlRemoveInvalidType() { + $this->assertResult( + '
                                              ', + '
                                                ' + ); + } + + function testLiConvertTypeCircle() { + $this->assertResult( + '
                                              1. ', + '
                                              2. ' + ); + } + + function testLiConvertTypeA() { + $this->assertResult( + '
                                              3. ', + '
                                              4. ' + ); + } + + function testLiConvertTypeCaseSensitive() { + $this->assertResult( + '
                                              5. ', + '
                                              6. ' + ); + } + + +} + diff --git a/tests/index.php b/tests/index.php index 69be2981..a98e20e6 100755 --- a/tests/index.php +++ b/tests/index.php @@ -5,7 +5,7 @@ error_reporting(E_ALL | E_STRICT); define('HTMLPurifierTest', 1); -define('HTMLPURIFIER_SCHEMA_STRICT', true); +define('HTMLPURIFIER_SCHEMA_STRICT', true); // validate schemas // wishlist: automated calling of this file from multiple PHP versions so we // don't have to constantly switch around @@ -13,10 +13,11 @@ define('HTMLPURIFIER_SCHEMA_STRICT', true); // default settings (protect against register_globals) $GLOBALS['HTMLPurifierTest'] = array(); $GLOBALS['HTMLPurifierTest']['PEAR'] = false; // do PEAR tests +$GLOBALS['HTMLPurifierTest']['PH5P'] = version_compare(PHP_VERSION, "5", ">=") && class_exists('DOMDocument'); $simpletest_location = 'simpletest/'; // reasonable guess // load SimpleTest -@include '../test-settings.php'; // don't mind if it isn't there +if (file_exists('../test-settings.php')) include '../test-settings.php'; require_once $simpletest_location . 'unit_tester.php'; require_once $simpletest_location . 'reporter.php'; require_once $simpletest_location . 'mock_objects.php'; @@ -79,7 +80,6 @@ if ($test_file = $GLOBALS['HTMLPurifierTest']['File']) { } else { $test = new GroupTest('All Tests'); - foreach ($test_files as $test_file) { require_once $test_file; $test->addTestClass(path2class($test_file)); diff --git a/tests/test_files.php b/tests/test_files.php index f9fa71c1..adb0df4c 100644 --- a/tests/test_files.php +++ b/tests/test_files.php @@ -79,6 +79,7 @@ $test_files[] = 'HTMLPurifier/GeneratorTest.php'; $test_files[] = 'HTMLPurifier/HTMLDefinitionTest.php'; $test_files[] = 'HTMLPurifier/HTMLModuleManagerTest.php'; $test_files[] = 'HTMLPurifier/HTMLModuleTest.php'; +$test_files[] = 'HTMLPurifier/HTMLModule/ObjectTest.php'; $test_files[] = 'HTMLPurifier/HTMLModule/RubyTest.php'; $test_files[] = 'HTMLPurifier/HTMLModule/ScriptingTest.php'; $test_files[] = 'HTMLPurifier/HTMLModule/TidyTest.php'; @@ -98,9 +99,13 @@ $test_files[] = 'HTMLPurifier/Strategy/FixNestingTest.php'; $test_files[] = 'HTMLPurifier/Strategy/FixNesting_ErrorsTest.php'; $test_files[] = 'HTMLPurifier/Strategy/MakeWellFormedTest.php'; $test_files[] = 'HTMLPurifier/Strategy/MakeWellFormed_ErrorsTest.php'; +$test_files[] = 'HTMLPurifier/Strategy/MakeWellFormed_InjectorTest.php'; $test_files[] = 'HTMLPurifier/Strategy/RemoveForeignElementsTest.php'; $test_files[] = 'HTMLPurifier/Strategy/RemoveForeignElements_ErrorsTest.php'; +$test_files[] = 'HTMLPurifier/Strategy/RemoveForeignElements_TidyTest.php'; $test_files[] = 'HTMLPurifier/Strategy/ValidateAttributesTest.php'; +$test_files[] = 'HTMLPurifier/Strategy/ValidateAttributes_IDTest.php'; +$test_files[] = 'HTMLPurifier/Strategy/ValidateAttributes_TidyTest.php'; $test_files[] = 'HTMLPurifier/TagTransformTest.php'; $test_files[] = 'HTMLPurifier/TokenTest.php'; $test_files[] = 'HTMLPurifier/URIDefinitionTest.php';