google_tag-8.x-1.x-dev/src/EventSubscriber/CspSubscriber.php
src/EventSubscriber/CspSubscriber.php
<?php
declare(strict_types=1);
namespace Drupal\google_tag\EventSubscriber;
use Drupal\csp\CspEvents;
use Drupal\csp\Event\PolicyAlterEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Csp Policy alter event subscriber.
*/
final class CspSubscriber implements EventSubscriberInterface {
/**
* GA domains.
*/
private const DOMAINS = [
'https://www.google-analytics.com',
'https://www.googletagmanager.com',
];
/**
* {@inheritDoc}
*/
public static function getSubscribedEvents(): array {
return [
CspEvents::POLICY_ALTER => 'alterPolicy',
];
}
/**
* Fires an event on csp policy alter event.
*
* @param \Drupal\csp\Event\PolicyAlterEvent $event
* Event object.
*/
public function alterPolicy(PolicyAlterEvent $event): void {
$policy = $event->getPolicy();
if ($policy->hasDirective('img-src')) {
$policy->appendDirective('img-src', self::DOMAINS);
}
elseif ($policy->hasDirective('default-src')) {
$imgDirective = array_merge($policy->getDirective('default-src'), self::DOMAINS);
$policy->setDirective('img-src', $imgDirective);
}
if ($policy->hasDirective('connect-src')) {
$policy->appendDirective('connect-src', self::DOMAINS);
}
elseif ($policy->hasDirective('default-src')) {
$connectDirective = array_merge($policy->getDirective('default-src'), self::DOMAINS);
$policy->setDirective('connect-src', $connectDirective);
}
}
}
