diff --git a/core/includes/menu.inc b/core/includes/menu.inc index a8a30b6..a9b7d5f 100644 --- a/core/includes/menu.inc +++ b/core/includes/menu.inc @@ -2607,6 +2607,9 @@ function menu_router_rebuild() { * (optional) Save the new router to the database. Defaults to FALSE. */ function menu_router_build($save = FALSE) { + // Ensure that all configuration used to build the menu items are loaded + // without overrides. + config_context_enter('config.context.free'); // We need to manually call each module so that we can know which module // a given item came from. $callbacks = array(); @@ -2621,6 +2624,8 @@ function menu_router_build($save = FALSE) { } // Alter the menu as defined in modules, keys are like user/%user. drupal_alter('menu', $callbacks); + // Return to the original context before menu building. + config_context_leave(); foreach ($callbacks as $path => $router_item) { // If the menu item is a default local task and incorrectly references a // route, remove it. diff --git a/core/modules/system/lib/Drupal/system/Tests/Menu/MenuRouterRebuildTest.php b/core/modules/system/lib/Drupal/system/Tests/Menu/MenuRouterRebuildTest.php new file mode 100644 index 0000000..a400770 --- /dev/null +++ b/core/modules/system/lib/Drupal/system/Tests/Menu/MenuRouterRebuildTest.php @@ -0,0 +1,54 @@ + 'Menu router rebuild', + 'description' => 'Tests menu_router_rebuild().', + 'group' => 'Menu', + ); + } + + function setUp() { + // Enable dummy module that implements hook_menu. + parent::setUp(); + + $language = new Language(array('id' => 'nl')); + language_save($language); + } + + /** + * Tests the context in menu router rebuild. + */ + public function testMenuRouterRebuildContext() { + // Enter a language context before rebuilding the menu router tables. + $language_context = config_context_enter('Drupal\Core\Config\Context\LanguageConfigContext'); + $language_context->setLanguage(language_load('nl')); + menu_router_rebuild(); + + // Check that the language context was not used for building the menu item. + $this->assertTrue(menu_get_item('menu-test/context')['title'] == 'English', 'The free context is used when rebuilding menu router items.'); + } + +} diff --git a/core/modules/system/tests/modules/menu_test/config/locale.config.nl.menu_test.menu_item.yml b/core/modules/system/tests/modules/menu_test/config/locale.config.nl.menu_test.menu_item.yml new file mode 100644 index 0000000..a845667 --- /dev/null +++ b/core/modules/system/tests/modules/menu_test/config/locale.config.nl.menu_test.menu_item.yml @@ -0,0 +1 @@ +title: Dutch diff --git a/core/modules/system/tests/modules/menu_test/config/menu_test.menu_item.yml b/core/modules/system/tests/modules/menu_test/config/menu_test.menu_item.yml new file mode 100644 index 0000000..ad3ab76 --- /dev/null +++ b/core/modules/system/tests/modules/menu_test/config/menu_test.menu_item.yml @@ -0,0 +1 @@ +title: English diff --git a/core/modules/system/tests/modules/menu_test/menu_test.module b/core/modules/system/tests/modules/menu_test/menu_test.module index ab2ef30..903d756 100644 --- a/core/modules/system/tests/modules/menu_test/menu_test.module +++ b/core/modules/system/tests/modules/menu_test/menu_test.module @@ -293,6 +293,11 @@ function menu_test_menu() { 'type' => MENU_LOCAL_TASK, ); + $items['menu-test/context'] = array( + 'title' => \Drupal::config('menu_test.menu_item')->get('title'), + 'route_name' => 'menu_test.context', + ); + return $items; } diff --git a/core/modules/system/tests/modules/menu_test/menu_test.routing.yml b/core/modules/system/tests/modules/menu_test/menu_test.routing.yml index 5ab1a94..cc333da 100644 --- a/core/modules/system/tests/modules/menu_test/menu_test.routing.yml +++ b/core/modules/system/tests/modules/menu_test/menu_test.routing.yml @@ -543,3 +543,10 @@ menu_test.title_test_case4: _content: '\Drupal\menu_test\Controller\MenuTestController::menuTestCallback' requirements: _access: 'TRUE' + +menu_test.context: + path: '/menu-test/context' + defaults: + _content: '\Drupal\menu_test\Controller\MenuTestController::menuTestCallback' + requirements: + _access: 'TRUE'