Commit 4b51ff93 authored by Daniel Kulbe's avatar Daniel Kulbe Committed by Alex Borsody
Browse files

Issue #3078282 by Daniel Kulbe: Service Worker caches admin toolbar and contextual links

parent 0c85b77d
Loading
Loading
Loading
Loading
+105 −0
Original line number Diff line number Diff line
diff --git a/pwa.module b/pwa.module
index 4fcfab6..74b7765 100644
--- a/pwa.module
+++ b/pwa.module
@@ -5,6 +5,7 @@
  * PWA hooks.
  */
 
+use Drupal\Core\Session\AccountInterface;
 use Drupal\Core\Url;
 use Drupal\pwa\Controller\PWAController;
 
@@ -73,3 +74,10 @@ function pwa_str_to_list($string) {
   $list = array_map('trim', $list);
   return array_filter($list, 'strlen');
 }
+
+/**
+ * Implements hook_user_login().
+ */
+function pwa_user_login(AccountInterface $account) {
+  \Drupal::service('session')->set('pwa_reset', TRUE);
+}
diff --git a/pwa.services.yml b/pwa.services.yml
index 385ec88..e2ce1f1 100644
--- a/pwa.services.yml
+++ b/pwa.services.yml
@@ -5,3 +5,7 @@ services:
       - '@config.factory'
       - '@language_manager'
       - '@theme.manager'
+  pwa.response_subscriber:
+    class: Drupal\pwa\EventSubscriber\ResponseSubscriber
+    tags:
+      - { name: event_subscriber }
diff --git a/src/EventSubscriber/ResponseSubscriber.php b/src/EventSubscriber/ResponseSubscriber.php
new file mode 100644
index 0000000..4fe5457
--- /dev/null
+++ b/src/EventSubscriber/ResponseSubscriber.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Drupal\pwa\EventSubscriber;
+
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\KernelEvents;
+
+/**
+ * Respond to event processes.
+ */
+class ResponseSubscriber implements EventSubscriberInterface {
+
+  /**
+   * Additional headers to set on user change.
+   *
+   * @var array
+   */
+  const HEADERS = [
+    'Clear-Site-Data' => '"storage"',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    return [
+      KernelEvents::RESPONSE => [
+        ['processResponse', 40],
+      ],
+    ];
+  }
+
+  /**
+   * Clear serviceworker cache on user change.
+   *
+   * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
+   *   The event to process.
+   *
+   * @see pwa_user_login()
+   */
+  public function processResponse(FilterResponseEvent $event) {
+    $response = $event->getResponse();
+
+    if ($event->getRequest()->get('_route') === 'user.logout') {
+      $response->headers->add(static::HEADERS);
+      return;
+    }
+
+    if (stripos($response->headers->get('Content-Type'), 'text/html') === FALSE) {
+      return;
+    }
+
+    $session = $event->getRequest()->getSession();
+
+    if ($session && $session->get('pwa_reset', FALSE)) {
+      $response->headers->add(static::HEADERS);
+
+      // Only once.
+      $session->remove('pwa_reset');
+    }
+  }
+
+}
+8 −0
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@
 * PWA hooks.
 */

use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;
use Drupal\pwa\Controller\PWAController;

@@ -73,3 +74,10 @@ function pwa_str_to_list($string) {
  $list = array_map('trim', $list);
  return array_filter($list, 'strlen');
}

/**
 * Implements hook_user_login().
 */
function pwa_user_login(AccountInterface $account) {
  \Drupal::service('session')->set('pwa_reset', TRUE);
}
+4 −0
Original line number Diff line number Diff line
@@ -5,3 +5,7 @@ services:
      - '@config.factory'
      - '@language_manager'
      - '@theme.manager'
  pwa.response_subscriber:
    class: Drupal\pwa\EventSubscriber\ResponseSubscriber
    tags:
      - { name: event_subscriber }
+64 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\pwa\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * Respond to event processes.
 */
class ResponseSubscriber implements EventSubscriberInterface {

  /**
   * Additional headers to set on user change.
   *
   * @var array
   */
  const HEADERS = [
    'Clear-Site-Data' => '"storage"',
  ];

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    return [
      KernelEvents::RESPONSE => [
        ['processResponse', 40],
      ],
    ];
  }

  /**
   * Clear serviceworker cache on user change.
   *
   * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
   *   The event to process.
   *
   * @see pwa_user_login()
   */
  public function processResponse(FilterResponseEvent $event) {
    $response = $event->getResponse();

    if ($event->getRequest()->get('_route') === 'user.logout') {
      $response->headers->add(static::HEADERS);
      return;
    }

    if (stripos($response->headers->get('Content-Type'), 'text/html') === FALSE) {
      return;
    }

    $session = $event->getRequest()->getSession();

    if ($session && $session->get('pwa_reset', FALSE)) {
      $response->headers->add(static::HEADERS);

      // Only once.
      $session->remove('pwa_reset');
    }
  }

}