You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.3 KiB
70 lines
2.3 KiB
<?php |
|
/** |
|
* Class AMP_Script_Sanitizer |
|
* |
|
* @since 1.0 |
|
* @package AMP |
|
*/ |
|
|
|
/** |
|
* Class AMP_Script_Sanitizer |
|
* |
|
* @since 1.0 |
|
*/ |
|
class AMP_Script_Sanitizer extends AMP_Base_Sanitizer { |
|
|
|
/** |
|
* Sanitize noscript elements. |
|
* |
|
* Eventually this should also handle script elements, if there is a known AMP equivalent. |
|
* If nothing is done with script elements, the whitelist sanitizer will deal with them ultimately. |
|
* |
|
* @todo Eventually this try to automatically convert script tags to AMP when they are recognized. See <https://github.com/ampproject/amp-wp/issues/1032>. |
|
* @todo When a script has an adjacent noscript, consider removing the script here to prevent validation error later. See <https://github.com/ampproject/amp-wp/issues/1213>. |
|
* |
|
* @since 1.0 |
|
*/ |
|
public function sanitize() { |
|
$noscripts = $this->dom->getElementsByTagName( 'noscript' ); |
|
|
|
for ( $i = $noscripts->length - 1; $i >= 0; $i-- ) { |
|
$noscript = $noscripts->item( $i ); |
|
|
|
// Skip AMP boilerplate. |
|
if ( $noscript->firstChild instanceof DOMElement && $noscript->firstChild->hasAttribute( 'amp-boilerplate' ) ) { |
|
continue; |
|
} |
|
|
|
/* |
|
* Skip noscript elements inside of amp-img or other AMP components for fallbacks. |
|
* See \AMP_Img_Sanitizer::adjust_and_replace_node(). Also skip if the element has dev mode. |
|
*/ |
|
if ( 'amp-' === substr( $noscript->parentNode->nodeName, 0, 4 ) || $this->has_dev_mode_exemption( $noscript ) ) { |
|
continue; |
|
} |
|
|
|
$is_inside_head_el = ( $noscript->parentNode && 'head' === $noscript->parentNode->nodeName ); |
|
$must_move_to_body = false; |
|
|
|
$fragment = $this->dom->createDocumentFragment(); |
|
$fragment->appendChild( $this->dom->createComment( 'noscript' ) ); |
|
while ( $noscript->firstChild ) { |
|
if ( $is_inside_head_el && ! $must_move_to_body ) { |
|
$must_move_to_body = ! AMP_DOM_Utils::is_valid_head_node( $noscript->firstChild ); |
|
} |
|
$fragment->appendChild( $noscript->firstChild ); |
|
} |
|
$fragment->appendChild( $this->dom->createComment( '/noscript' ) ); |
|
|
|
if ( $must_move_to_body ) { |
|
$body = $this->dom->getElementsByTagName( 'body' )->item( 0 ); |
|
$body->insertBefore( $fragment, $body->firstChild ); |
|
$noscript->parentNode->removeChild( $noscript ); |
|
} else { |
|
$noscript->parentNode->replaceChild( $fragment, $noscript ); |
|
} |
|
|
|
$this->did_convert_elements = true; |
|
} |
|
} |
|
}
|
|
|