Files

129 lines
3.6 KiB
PHP

<?php
declare(strict_types=1);
use Magento\Framework\App\Bootstrap;
use Magento\Framework\App\Response\Http;
use Magento\Framework\Event\ManagerInterface;
require dirname(__DIR__, 4) . '/bootstrap.php';
$params = $_SERVER;
$bootstrap = Bootstrap::create(BP, $params);
$objectManager = $bootstrap->getObjectManager();
// Load frontend event configuration because the observer is declared in etc/frontend/events.xml.
$appState = $objectManager->get(\Magento\Framework\App\State::class);
try {
$appState->setAreaCode('frontend');
} catch (\Magento\Framework\Exception\LocalizedException $e) {
// Area code may already be set. That's fine.
}
$observer = $objectManager->get(
\CK\LibxmlPainInTheAss\Observer\RepairMageInitAttributes::class
);
echo "Observer class: " . get_class($observer) . PHP_EOL;
echo "============================================================\n";
echo "CK_LibxmlPainInTheAss observer test\n";
echo "============================================================\n";
echo 'PHP: ' . PHP_VERSION . PHP_EOL;
echo 'libxml: ' . (defined('LIBXML_LOADED_VERSION') ? LIBXML_LOADED_VERSION : 'undefined') . PHP_EOL;
echo PHP_EOL;
// Create a real Magento HTTP response object.
$response = $objectManager->create(Http::class);
$response->setHeader(
'Content-Type',
'text/html; charset=UTF-8',
true
);
/*
* This is the exact malformed output caused by:
*
* libxml 2.15.3 saveHTML()
* +
* html_entity_decode(ENT_QUOTES)
*/
$input = '<html><body>' .
'<div id="test-1" data-mage-init="{"key":"value"}"></div>' .
'<div id="test-2" data-mage-init="{"foo":{"bar":"baz"}}"></div>' .
'</body></html>';
$response->setContent($input);
echo "BEFORE:\n";
echo $response->getContent() . PHP_EOL;
echo PHP_EOL;
// Dispatch the exact Magento event used by the module.
$eventManager = $objectManager->get(ManagerInterface::class);
$eventManager->dispatch(
'controller_front_send_response_before',
[
'response' => $response,
]
);
$output = $response->getContent();
echo "AFTER:\n";
echo $output . PHP_EOL;
echo PHP_EOL;
// Assertions.
echo "============================================================\n";
echo "RESULTS\n";
echo "============================================================\n";
$expected1 = '<div id="test-1" data-mage-init=\'{"key":"value"}\'></div>';
$expected2 = '<div id="test-2" data-mage-init=\'{"foo":{"bar":"baz"}}\'></div>';
$isBugVersion = (defined('LIBXML_LOADED_VERSION') && (int)LIBXML_LOADED_VERSION === 21503);
if ($isBugVersion) {
$checks = [
'Target libxml version detected' => true,
'Basic data-mage-init repaired' => strpos($output, $expected1) !== false,
'Nested JSON repaired' => strpos($output, $expected2) !== false,
'Basic broken form removed' => strpos($output, '<div id="test-1" data-mage-init="{"key":"value"}"></div>') === false,
'Nested broken form removed' => strpos($output, '<div id="test-2" data-mage-init="{"foo":{"bar":"baz"}}"></div>') === false,
];
} else {
$checks = [
'Non-target libxml version bypassed' => $output === $input,
'Non-target libxml left input unchanged' => strpos($output, '<div id="test-1" data-mage-init="{"key":"value"}"></div>') !== false,
'Nested HTML unchanged' => strpos($output, '<div id="test-2" data-mage-init="{"foo":{"bar":"baz"}}"></div>') !== false,
];
}
$failed = false;
foreach ($checks as $name => $passed) {
echo str_pad($name, 35)
. ': '
. ($passed ? 'PASS' : 'FAIL')
. PHP_EOL;
if (!$passed) {
$failed = true;
}
}
echo PHP_EOL;
if ($failed) {
echo "OVERALL: FAIL\n";
exit(1);
}
echo "OVERALL: PASS\n";
exit(0);