diff --git a/core/modules/system/src/EventSubscriber/AdminRouteSubscriber.php b/core/modules/system/src/EventSubscriber/AdminRouteSubscriber.php index 5b926ed275..50b3a57808 100644 --- a/core/modules/system/src/EventSubscriber/AdminRouteSubscriber.php +++ b/core/modules/system/src/EventSubscriber/AdminRouteSubscriber.php @@ -44,9 +44,12 @@ public static function getSubscribedEvents() { * The route to analyze. * * @return bool + * TRUE if HTML is a valid format for this route. */ protected static function isHtmlRoute(Route $route) { - return !$route->hasRequirement('_format') || $route->getRequirement('_format') === 'html'; + // If a route has no explicit format, then HTML is valid. + $format = $route->hasRequirement('_format') ? explode('|', $route->getRequirement('_format')) : ['html']; + return in_array('html', $format, TRUE); } } diff --git a/core/modules/system/tests/src/Unit/Routing/AdminRouteSubscriberTest.php b/core/modules/system/tests/src/Unit/Routing/AdminRouteSubscriberTest.php new file mode 100644 index 0000000000..153391c419 --- /dev/null +++ b/core/modules/system/tests/src/Unit/Routing/AdminRouteSubscriberTest.php @@ -0,0 +1,70 @@ +add('the_route', $route); + (new AdminRouteSubscriber())->onAlterRoutes(new RouteBuildEvent($collection)); + + $this->assertSame($is_admin, $route->getOption('_admin_route')); + } + + public function providerTestAlterRoutes() { + $data = []; + $data['non-admin'] = [ + new Route('/foo'), + NULL, + ]; + $data['admin prefix'] = [ + new Route('/admin/foo'), + TRUE, + ]; + $data['admin option'] = [ + (new Route('/foo')) + ->setOption('_admin_route', TRUE), + TRUE, + ]; + $data['admin prefix, non-HTML format'] = [ + (new Route('/admin/foo')) + ->setRequirement('_format', 'json'), + NULL, + ]; + $data['admin option, non-HTML format'] = [ + (new Route('/foo')) + ->setRequirement('_format', 'json') + ->setOption('_admin_route', TRUE), + TRUE, + ]; + $data['admin prefix, HTML format'] = [ + (new Route('/admin/foo')) + ->setRequirement('_format', 'html'), + TRUE, + ]; + $data['admin prefix, multi-format including HTML'] = [ + (new Route('/admin/foo')) + ->setRequirement('_format', 'json|html'), + TRUE, + ]; + return $data; + } + +}