0
0
mirror of https://github.com/ezyang/htmlpurifier.git synced 2025-03-23 14:27:02 +00:00

Fix bug in background-position with center keyword.

Signed-off-by: Edward Z. Yang <ezyang@mit.edu>
This commit is contained in:
Edward Z. Yang 2010-05-05 15:08:57 -04:00
parent 1a70bffd5a
commit 3166b8a10f
3 changed files with 20 additions and 12 deletions

1
NEWS
View File

@ -11,6 +11,7 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
4.1.1, unknown release date 4.1.1, unknown release date
- Emit an error for CollectErrors if a body is extracted - Emit an error for CollectErrors if a body is extracted
- Fix bug where in background-position for center keyword handling.
4.1.0, released 2010-04-26 4.1.0, released 2010-04-26
! Support proprietary height attribute on table element ! Support proprietary height attribute on table element

View File

@ -59,7 +59,8 @@ class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef
$keywords = array(); $keywords = array();
$keywords['h'] = false; // left, right $keywords['h'] = false; // left, right
$keywords['v'] = false; // top, bottom $keywords['v'] = false; // top, bottom
$keywords['c'] = false; // center $keywords['ch'] = false; // center (first word)
$keywords['cv'] = false; // center (second word)
$measures = array(); $measures = array();
$i = 0; $i = 0;
@ -79,6 +80,13 @@ class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef
$lbit = ctype_lower($bit) ? $bit : strtolower($bit); $lbit = ctype_lower($bit) ? $bit : strtolower($bit);
if (isset($lookup[$lbit])) { if (isset($lookup[$lbit])) {
$status = $lookup[$lbit]; $status = $lookup[$lbit];
if ($status == 'c') {
if ($i == 0) {
$status = 'ch';
} else {
$status = 'cv';
}
}
$keywords[$status] = $lbit; $keywords[$status] = $lbit;
$i++; $i++;
} }
@ -101,20 +109,19 @@ class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef
if (!$i) return false; // no valid values were caught if (!$i) return false; // no valid values were caught
$ret = array(); $ret = array();
// first keyword // first keyword
if ($keywords['h']) $ret[] = $keywords['h']; if ($keywords['h']) $ret[] = $keywords['h'];
elseif (count($measures)) $ret[] = array_shift($measures); elseif ($keywords['ch']) {
elseif ($keywords['c']) { $ret[] = $keywords['ch'];
$ret[] = $keywords['c']; $keywords['cv'] = false; // prevent re-use: center = center center
$keywords['c'] = false; // prevent re-use: center = center center
} }
elseif (count($measures)) $ret[] = array_shift($measures);
if ($keywords['v']) $ret[] = $keywords['v']; if ($keywords['v']) $ret[] = $keywords['v'];
elseif ($keywords['cv']) $ret[] = $keywords['cv'];
elseif (count($measures)) $ret[] = array_shift($measures); elseif (count($measures)) $ret[] = array_shift($measures);
elseif ($keywords['c']) $ret[] = $keywords['c'];
if (empty($ret)) return false; if (empty($ret)) return false;
return implode(' ', $ret); return implode(' ', $ret);

View File

@ -28,13 +28,13 @@ class HTMLPurifier_AttrDef_CSS_BackgroundPositionTest extends HTMLPurifier_AttrD
// reordered due to internal impl details // reordered due to internal impl details
$this->assertDef('top left', 'left top'); $this->assertDef('top left', 'left top');
$this->assertDef('top center', 'center top'); $this->assertDef('top center', 'top');
$this->assertDef('top right', 'right top'); $this->assertDef('top right', 'right top');
$this->assertDef('center left', 'left center'); $this->assertDef('center left', 'left');
$this->assertDef('center center', 'center'); // two centers collide $this->assertDef('center center', 'center');
$this->assertDef('center right', 'right center'); $this->assertDef('center right', 'right');
$this->assertDef('bottom left', 'left bottom'); $this->assertDef('bottom left', 'left bottom');
$this->assertDef('bottom center', 'center bottom'); $this->assertDef('bottom center', 'bottom');
$this->assertDef('bottom right', 'right bottom'); $this->assertDef('bottom right', 'right bottom');
// more cases from the defined syntax // more cases from the defined syntax