diff --git a/HTMLPurifier.xcodeproj/project.pbxproj b/HTMLPurifier.xcodeproj/project.pbxproj
index 8b13b08..8c8258b 100644
--- a/HTMLPurifier.xcodeproj/project.pbxproj
+++ b/HTMLPurifier.xcodeproj/project.pbxproj
@@ -330,6 +330,10 @@
806C47071B7F233100FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.h in Headers */ = {isa = PBXBuildFile; fileRef = 806C47051B7F233100FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.h */; };
806C47091B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = 806C47081B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m */; };
806C470A1B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m in Sources */ = {isa = PBXBuildFile; fileRef = 806C47081B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m */; };
+ 806C470C1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m in Sources */ = {isa = PBXBuildFile; fileRef = 806C470B1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m */; };
+ 806C470D1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m in Sources */ = {isa = PBXBuildFile; fileRef = 806C470B1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m */; };
+ 806C470F1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h in Headers */ = {isa = PBXBuildFile; fileRef = 806C470E1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h */; };
+ 806C47101B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h in Headers */ = {isa = PBXBuildFile; fileRef = 806C470E1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h */; };
808CB9C21887DCAA00AFB841 /* HTMLPurifier_AttrDef_HTML_BoolTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 808CB9C11887DCAA00AFB841 /* HTMLPurifier_AttrDef_HTML_BoolTest.m */; };
808CB9C71887E4D500AFB841 /* HTMLPurifier_AttrDefHarness.m in Sources */ = {isa = PBXBuildFile; fileRef = 808CB9C61887E4D500AFB841 /* HTMLPurifier_AttrDefHarness.m */; };
808CB9C918881BD200AFB841 /* HTMLPurifier_AttrDef_HTML_ColorTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 808CB9C818881BD200AFB841 /* HTMLPurifier_AttrDef_HTML_ColorTest.m */; };
@@ -837,6 +841,8 @@
806C47021B7D263000FE1D4C /* HTMLPurifier_AttrDef_CSS_Shape.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLPurifier_AttrDef_CSS_Shape.m; sourceTree = ""; };
806C47051B7F233100FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLPurifier_AttrDef_CSS_Outline.h; sourceTree = ""; };
806C47081B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLPurifier_AttrDef_CSS_Outline.m; sourceTree = ""; };
+ 806C470B1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLPurifier_AttrDef_CSS_BorderRadius.m; sourceTree = ""; };
+ 806C470E1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLPurifier_AttrDef_CSS_BorderRadius.h; sourceTree = ""; };
808CB9C11887DCAA00AFB841 /* HTMLPurifier_AttrDef_HTML_BoolTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLPurifier_AttrDef_HTML_BoolTest.m; sourceTree = ""; };
808CB9C51887E4D500AFB841 /* HTMLPurifier_AttrDefHarness.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLPurifier_AttrDefHarness.h; sourceTree = ""; };
808CB9C61887E4D500AFB841 /* HTMLPurifier_AttrDefHarness.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HTMLPurifier_AttrDefHarness.m; sourceTree = ""; };
@@ -1636,6 +1642,8 @@
80F53C1E189BE6F600D7805F /* HTMLPurifier_AttrDef_CSS_BackgroundPosition.m */,
80F53C1F189BE6F600D7805F /* HTMLPurifier_AttrDef_CSS_Border.h */,
80F53C20189BE6F600D7805F /* HTMLPurifier_AttrDef_CSS_Border.m */,
+ 806C470E1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h */,
+ 806C470B1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m */,
806C47051B7F233100FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.h */,
806C47081B7F237B00FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.m */,
80F53C21189BE6F600D7805F /* HTMLPurifier_AttrDef_CSS_Color.h */,
@@ -2098,6 +2106,7 @@
files = (
806C47001B7D261900FE1D4C /* HTMLPurifier_AttrDef_CSS_Shape.h in Headers */,
1EE4B32E1B13AFAA0056091D /* HTMLPurifier-Prefix.pch in Headers */,
+ 806C470F1B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h in Headers */,
1EB9ACE61B144E0D000EDDA5 /* BasicPHP.h in Headers */,
1E48254318ED9D7F00E4CC64 /* HTMLPurifier.h in Headers */,
806C47061B7F233100FE1D4C /* HTMLPurifier_AttrDef_CSS_Outline.h in Headers */,
@@ -2294,6 +2303,7 @@
80F53EE1189BE6F700D7805F /* HTMLPurifier_URIFilter_Munge.h in Headers */,
80F53DA2189BE6F700D7805F /* HTMLPurifier_AttrDef_CSS_Font.h in Headers */,
80F53E9C189BE6F700D7805F /* HTMLPurifier_Lexer_libxmlLex.h in Headers */,
+ 806C47101B7F750B00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.h in Headers */,
80F53E36189BE6F700D7805F /* HTMLPurifier_ConfigSchema.h in Headers */,
80F53E02189BE6F700D7805F /* HTMLPurifier_AttrTransform_Nofollow.h in Headers */,
80F53D9E189BE6F700D7805F /* HTMLPurifier_AttrDef_CSS_DenyElementDecorator.h in Headers */,
@@ -2487,6 +2497,7 @@
1E4825D818ED9DDF00E4CC64 /* HTMLPurifier_DefinitionCache.m in Sources */,
1E4825D918ED9DDF00E4CC64 /* HTMLPurifier_DefinitionCacheFactory.m in Sources */,
1E4825DA18ED9DDF00E4CC64 /* HTMLPurifier_HTMLDefinition.m in Sources */,
+ 806C470C1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m in Sources */,
1E4825DB18ED9DDF00E4CC64 /* HTMLPurifier_URIDefinition.m in Sources */,
1E4825DC18ED9DDF00E4CC64 /* HTMLPurifier_Strategy.m in Sources */,
1E4825DD18ED9DDF00E4CC64 /* HTMLPurifier_Strategy_Composite.m in Sources */,
@@ -2750,6 +2761,7 @@
80F53E43189BE6F700D7805F /* HTMLPurifier_DefinitionCache.m in Sources */,
80F53DEB189BE6F700D7805F /* HTMLPurifier_AttrTransform_BdoDir.m in Sources */,
80F53E2B189BE6F700D7805F /* HTMLPurifier_ChildDef_Optional.m in Sources */,
+ 806C470D1B7F74FA00FE1D4C /* HTMLPurifier_AttrDef_CSS_BorderRadius.m in Sources */,
80F53DED189BE6F700D7805F /* HTMLPurifier_AttrTransform_BgColor.m in Sources */,
80F53E6F189BE6F700D7805F /* HTMLPurifier_HTMLModule_Text.m in Sources */,
80F53EF8189BE6F700D7805F /* HTMLPurifier_URISchemeRegistry.m in Sources */,
diff --git a/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.h b/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.h
new file mode 100644
index 0000000..a53b443
--- /dev/null
+++ b/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.h
@@ -0,0 +1,19 @@
+//
+// HTMLPurifier_AttrDef_CSS_BorderRadius.h
+// HTMLPurifier
+//
+// Created by Lukas Neumann on 15.08.15.
+// Copyright (c) 2015 Mynigma. All rights reserved.
+//
+
+#import "HTMLPurifier_AttrDef.h"
+
+@interface HTMLPurifier_AttrDef_CSS_BorderRadius : HTMLPurifier_AttrDef
+/**
+ * Validates the border-radius property as defined by CSS.
+ */
+
+- (NSString*)validateWithString:(NSString*)string config:(HTMLPurifier_Config*)config context:(HTMLPurifier_Context*)context;
+
+@end
+
diff --git a/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.m b/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.m
new file mode 100644
index 0000000..8536c16
--- /dev/null
+++ b/HTMLPurifier/Attributes/AttrDef/CSS/HTMLPurifier_AttrDef_CSS_BorderRadius.m
@@ -0,0 +1,27 @@
+//
+// HTMLPurifier_AttrDef_CSS_BorderRadius.m
+// HTMLPurifier
+//
+// Created by Lukas Neumann on 15.08.15.
+// Copyright (c) 2015 Mynigma. All rights reserved.
+//
+
+#import "HTMLPurifier_AttrDef_CSS_BorderRadius.h"
+#import "BasicPHP.h"
+
+
+@implementation HTMLPurifier_AttrDef_CSS_BorderRadius
+
+/**
+ * @param string $string
+ * @param HTMLPurifier_Config $config
+ * @param HTMLPurifier_Context $context
+ * @return bool|string
+ */
+- (NSString*)validateWithString:(NSString*)string config:(HTMLPurifier_Config*)config context:(HTMLPurifier_Context*)context
+{
+ return nil;
+}
+
+
+@end
diff --git a/HTMLPurifier/Definition/HTMLPurifier_CSSDefinition.m b/HTMLPurifier/Definition/HTMLPurifier_CSSDefinition.m
index 5db7e65..62550e5 100644
--- a/HTMLPurifier/Definition/HTMLPurifier_CSSDefinition.m
+++ b/HTMLPurifier/Definition/HTMLPurifier_CSSDefinition.m
@@ -29,6 +29,7 @@
#import "HTMLPurifier_AttrDef_CSS_AlphaValue.h"
#import "HTMLPurifier_AttrDef_Integer.h"
#import "HTMLPurifier_AttrDef_CSS_Outline.h"
+#import "HTMLPurifier_AttrDef_CSS_BorderRadius.h"
#import "BasicPHP.h"
@@ -83,6 +84,16 @@ - (void)doSetup:(HTMLPurifier_Config*)config
// border-color
[self.info setObject:[[HTMLPurifier_AttrDef_CSS_Multiple alloc] initWithSingle:color_or_transparent] forKey:@"border-color"];
+ // border-top-left-radius border-top-right-radius border-bottom-left-radius border-bottom-right-radius
+ HTMLPurifier_AttrDef_CSS_Composite* border_radius = [[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"initial"]],[[HTMLPurifier_AttrDef_CSS_Multiple alloc] initWithSingle:[HTMLPurifier_AttrDef_CSS_Length new] max:2],[[HTMLPurifier_AttrDef_CSS_Multiple alloc] initWithSingle:[HTMLPurifier_AttrDef_CSS_Percentage new] max:2]]];
+ [self.info setObject:border_radius forKey:@"border-top-left-radius"];
+ [self.info setObject:border_radius forKey:@"border-top-right-radius"];
+ [self.info setObject:border_radius forKey:@"border-bottom-right-radius"];
+ [self.info setObject:border_radius forKey:@"border-bottom-left-radius"];
+
+ // border-radius
+ [self.info setObject:[HTMLPurifier_AttrDef_CSS_BorderRadius new] forKey:@"border-radius"];
+
// border-spacing
[self.info setObject:[[HTMLPurifier_AttrDef_CSS_Multiple alloc] initWithSingle:[HTMLPurifier_AttrDef_CSS_Length new] max:2] forKey:@"border-spacing"];
@@ -290,67 +301,50 @@ - (void)doSetup:(HTMLPurifier_Config*)config
[self.info setObject:length_percentage_auto forKey:@"right"];
// table-layout
-
+ [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"auto", @"fixed"]] forKey:@"table-layout"];
+
// text-align
-
[self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"left", @"right", @"center", @"justify"] caseSensitive:NO] forKey:@"text-align"];
- [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"capitalize", @"uppercase", @"lowercase", @"none"] caseSensitive:NO] forKey:@"text-transform"];
-
-
-
-
- [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Length alloc] initWithMin:0] forKey:@"border-radius"];
+ // text-decoration
+ [self.info setObject:[HTMLPurifier_AttrDef_CSS_TextDecoration new] forKey:@"text-decoration"];
+ // text-indent
+ [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[HTMLPurifier_AttrDef_CSS_Length new], [HTMLPurifier_AttrDef_CSS_Percentage new]]] forKey:@"text-indent"];
+ // text-transform
+ [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"capitalize", @"uppercase", @"lowercase", @"none"] caseSensitive:NO] forKey:@"text-transform"];
- [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"normal"]], [HTMLPurifier_AttrDef_CSS_Length new]]] forKey:@"word-spacing"];
-
-
- [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[[HTMLPurifier_AttrDef_CSS_Length alloc] init], [[HTMLPurifier_AttrDef_CSS_Percentage alloc] init]]] forKey:@"text-indent"];
-
+ // top
+ [self.info setObject:length_percentage_auto forKey:@"top"];
+ // unicode-bidi
+ [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"normal",@"embed",@"bidi-override"]] forKey:@"unicode-bidi"];
-
- [self.info setObject:maxLength forKey:@"width"];
-
- [self.info setObject:[[HTMLPurifier_AttrDef_CSS_TextDecoration alloc] init] forKey:@"text-decoration"];
-
-
-
- [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"auto", @"fixed"]] forKey:@"table-layout"];
-
-
+ // vertical-align
[self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"baseline", @"sub", @"super", @"top", @"text-top", @"middle", @"bottom", @"text-bottom"]], [HTMLPurifier_AttrDef_CSS_Length new], [HTMLPurifier_AttrDef_CSS_Percentage new]]] forKey:@"vertical-align"];
+ // visibility
+ [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"visible",@"hidden",@"collapse"]] forKey:@"visibility"];
+ // white-space
+ [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"nowrap", @"normal", @"pre", @"pre-wrap", @"pre-line"]] forKey:@"white-space"];
+
+ // widows
+ [self.info setObject:[HTMLPurifier_AttrDef_Integer new] forKey:@"widows"];
- NSArray* array = @[@"visible",@"hidden",@"collapse"];
- HTMLPurifier_AttrDef_Enum* newEnum = [[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:array];
- [self.info setObject:newEnum forKey:@"visibility"];
+ // width
+ [self.info setObject:maxLength forKey:@"width"];
+ // word-spacing
+ [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"normal"]], [HTMLPurifier_AttrDef_CSS_Length new]]] forKey:@"word-spacing"];
+ // z-index
+ [self.info setObject:[[HTMLPurifier_AttrDef_CSS_Composite alloc] initWithDefs:@[[HTMLPurifier_AttrDef_Integer new], _auto]] forKey:@"z-index"];
-
- // These CSS properties don't work on many browsers, but we live
- // in THE FUTURE!
- [self.info setObject:[[HTMLPurifier_AttrDef_Enum alloc] initWithValidValues:@[@"nowrap", @"normal", @"pre", @"pre-wrap", @"pre-line"]] forKey:@"white-space"];
- /*
- if ([[config get:@"CSS.Proprietary"] boolValue])
- {
- [self doSetupProprietary:config];
- }
-
-
- if ([config get:@"CSS.Trusted"])
- {
- [self doSetupTrusted:config];
- }*/
-
BOOL allow_important = [[config get:@"CSS.AllowImportant"] isEqual:@YES];
-
// wrap all attr-defs with decorator that handles !important
NSArray* allKeys = self.info.allKeys;
for(NSString* k in allKeys)
@@ -363,44 +357,6 @@ - (void)doSetup:(HTMLPurifier_Config*)config
[self setupConfigStuff:config];
}
-// /**
-// * @param HTMLPurifier_Config $config
-// */
-// protected function doSetupProprietary($config)
-// {
-// // Internet Explorer only scrollbar colors
-// $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
-// $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color();
-// $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
-// $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color();
-// $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color();
-// $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color();
-//
-// // technically not proprietary, but CSS3, and no one supports it
-// $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
-// $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
-// $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue();
-//
-// // only opacity, for now
-// $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter();
-//
-// // more CSS3
-// $this->info['page-break-after'] =
-// $this->info['page-break-before'] = new HTMLPurifier_AttrDef_Enum(
-// array(
-// 'auto',
-// 'always',
-// 'avoid',
-// 'left',
-// 'right'
-// )
-// );
-// $this->info['page-break-inside'] = new HTMLPurifier_AttrDef_Enum(array('auto', 'avoid'));
-//
-// }
-//
-// );
-
/**
* Performs extra config-based processing. Based off of
diff --git a/HTMLPurifierTests/CSSTest.m b/HTMLPurifierTests/CSSTest.m
index ac6a40c..a323e53 100644
--- a/HTMLPurifierTests/CSSTest.m
+++ b/HTMLPurifierTests/CSSTest.m
@@ -337,7 +337,7 @@ - (void)testBackgroundPosition
- (void)testBackgroundColor
{
- [self assertDef:@"background:lightgrey;"];
+ [self assertDef:@"background:lightgrey;" expected:@"background:#D3D3D3;"];
}
- (void)testBorderSpacing
@@ -392,7 +392,8 @@ - (void)testNodice
- (void)testPositionAbsolute
{
- [self assertDef:@"position:absolute;" expected:nil];
+ // former: [self assertDef:@"position:absolute;" expected:nil];
+ [self assertDef:@"position:absolute;"];
}
- (void)testBackgroundImageUrlScript
diff --git a/HTMLPurifierTests/HTMLPurifierTests.m b/HTMLPurifierTests/HTMLPurifierTests.m
index 3eed358..4d7e3f0 100644
--- a/HTMLPurifierTests/HTMLPurifierTests.m
+++ b/HTMLPurifierTests/HTMLPurifierTests.m
@@ -135,7 +135,7 @@ -(void) testVisibility
{
NSString* test = @" Popular video by EinKamel: \"WM 2014 Müller boarisch\"";
NSString* result = [purifier purify:test];
- XCTAssertEqualObjects(result,@" Popular video by EinKamel: \"WM 2014 Müller boarisch\"");
+ XCTAssertEqualObjects(result,@" Popular video by EinKamel: \"WM 2014 Müller boarisch\"");
}
-(void) testBase64Img