Version 1
[yaffs-website] / web / modules / contrib / devel / webprofiler / src / EventSubscriber / WebprofilerEventSubscriber.php
1 <?php
2
3 namespace Drupal\webprofiler\EventSubscriber;
4
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;
12
13 /**
14  * Class WebprofilerEventSubscriber
15  */
16 class WebprofilerEventSubscriber implements EventSubscriberInterface {
17
18   /**
19    * @var \Drupal\Core\Session\AccountInterface
20    */
21   private $currentUser;
22
23   /**
24    * @var \Drupal\Core\Routing\UrlGeneratorInterface
25    */
26   protected $urlGenerator;
27
28   /**
29    * @var \Drupal\Core\Render\RendererInterface
30    */
31   protected $renderer;
32
33   /**
34    * @param \Drupal\Core\Session\AccountInterface $currentUser
35    * @param \Drupal\Core\Routing\UrlGeneratorInterface $urlGenerator
36    * @param \Drupal\Core\Render\RendererInterface $renderer
37    */
38   public function __construct(AccountInterface $currentUser, UrlGeneratorInterface $urlGenerator, RendererInterface $renderer) {
39     $this->currentUser = $currentUser;
40     $this->urlGenerator = $urlGenerator;
41     $this->renderer = $renderer;
42   }
43
44   /**
45    * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
46    */
47   public function onKernelResponse(FilterResponseEvent $event) {
48     $response = $event->getResponse();
49     $request = $event->getRequest();
50
51     if ($response->headers->has('X-Debug-Token') && NULL !== $this->urlGenerator) {
52       $response->headers->set(
53         'X-Debug-Token-Link',
54         $this->urlGenerator->generate('webprofiler.dashboard', ['profile' => $response->headers->get('X-Debug-Token')])
55       );
56     }
57
58     // do not capture redirects or modify XML HTTP Requests
59     if ($request->isXmlHttpRequest()) {
60       return;
61     }
62
63     if ($this->currentUser->hasPermission('view webprofiler toolbar')) {
64       $this->injectToolbar($response);
65     }
66   }
67
68   /**
69    * @param \Symfony\Component\HttpFoundation\Response $response
70    */
71   protected function injectToolbar(Response $response) {
72     $content = $response->getContent();
73     $pos = mb_strripos($content, '</body>');
74
75     if (FALSE !== $pos) {
76       if ($token = $response->headers->get('X-Debug-Token')) {
77         $loader = [
78           '#theme' => 'webprofiler_loader',
79           '#token' => $token,
80           '#profiler_url' => $this->urlGenerator->generate('webprofiler.toolbar', ['profile' => $token]),
81         ];
82
83         $content = mb_substr($content, 0, $pos) . $this->renderer->renderRoot($loader) . mb_substr($content, $pos);
84         $response->setContent($content);
85       }
86     }
87   }
88
89   /**
90    * @return array
91    */
92   public static function getSubscribedEvents() {
93     return [
94       KernelEvents::RESPONSE => ['onKernelResponse', -128],
95     ];
96   }
97 }