3 namespace Drupal\webprofiler\EventSubscriber;
5 use Drupal\Core\Render\RendererInterface;
6 use Drupal\Core\Routing\UrlGeneratorInterface;
7 use Drupal\Core\Session\AccountInterface;
8 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
9 use Symfony\Component\HttpFoundation\Response;
10 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
11 use Symfony\Component\HttpKernel\KernelEvents;
14 * Class WebprofilerEventSubscriber
16 class WebprofilerEventSubscriber implements EventSubscriberInterface {
19 * @var \Drupal\Core\Session\AccountInterface
24 * @var \Drupal\Core\Routing\UrlGeneratorInterface
26 protected $urlGenerator;
29 * @var \Drupal\Core\Render\RendererInterface
34 * @param \Drupal\Core\Session\AccountInterface $currentUser
35 * @param \Drupal\Core\Routing\UrlGeneratorInterface $urlGenerator
36 * @param \Drupal\Core\Render\RendererInterface $renderer
38 public function __construct(AccountInterface $currentUser, UrlGeneratorInterface $urlGenerator, RendererInterface $renderer) {
39 $this->currentUser = $currentUser;
40 $this->urlGenerator = $urlGenerator;
41 $this->renderer = $renderer;
45 * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
47 public function onKernelResponse(FilterResponseEvent $event) {
48 $response = $event->getResponse();
49 $request = $event->getRequest();
51 if ($response->headers->has('X-Debug-Token') && NULL !== $this->urlGenerator) {
52 $response->headers->set(
54 $this->urlGenerator->generate('webprofiler.dashboard', ['profile' => $response->headers->get('X-Debug-Token')])
58 // do not capture redirects or modify XML HTTP Requests
59 if ($request->isXmlHttpRequest()) {
63 if ($this->currentUser->hasPermission('view webprofiler toolbar')) {
64 $this->injectToolbar($response);
69 * @param \Symfony\Component\HttpFoundation\Response $response
71 protected function injectToolbar(Response $response) {
72 $content = $response->getContent();
73 $pos = mb_strripos($content, '</body>');
76 if ($token = $response->headers->get('X-Debug-Token')) {
78 '#theme' => 'webprofiler_loader',
80 '#profiler_url' => $this->urlGenerator->generate('webprofiler.toolbar', ['profile' => $token]),
83 $content = mb_substr($content, 0, $pos) . $this->renderer->renderRoot($loader) . mb_substr($content, $pos);
84 $response->setContent($content);
92 public static function getSubscribedEvents() {
94 KernelEvents::RESPONSE => ['onKernelResponse', -128],