diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc index aac0c3d..f720d1f 100644 --- a/core/modules/system/system.admin.inc +++ b/core/modules/system/system.admin.inc @@ -831,10 +831,10 @@ function system_modules($form, $form_state = array()) { $extra['disabled'] = TRUE; } elseif ($files[$requires]->status) { - $extra['requires'][$requires] = t('@module (enabled)', array('@module' => $requires_name)); + $extra['requires'][$requires] = t('@module (enabled)', array('@anchor' => '#module-' . $files[$requires]->name, '@module' => $requires_name)); } else { - $extra['requires'][$requires] = t('@module (disabled)', array('@module' => $requires_name)); + $extra['requires'][$requires] = t('@module (disabled)', array('@anchor' => '#module-' . $files[$requires]->name, '@module' => $requires_name)); } } } @@ -878,11 +878,11 @@ function system_modules($form, $form_state = array()) { // Hidden modules are unset already. if (isset($visible_files[$required_by])) { if ($files[$required_by]->status == 1 && $module->status == 1) { - $extra['required_by'][] = t('@module (enabled)', array('@module' => $files[$required_by]->info['name'])); + $extra['required_by'][] = t('@module (enabled)', array('@anchor' => '#module-' . $files[$required_by]->name, '@module' => $files[$required_by]->info['name'])); $extra['disabled'] = TRUE; } else { - $extra['required_by'][] = t('@module (disabled)', array('@module' => $files[$required_by]->info['name'])); + $extra['required_by'][] = t('@module (disabled)', array('@anchor' => '#module-' . $files[$required_by]->name, '@module' => $files[$required_by]->info['name'])); } } } @@ -2605,7 +2605,10 @@ function theme_system_modules_fieldset($variables) { $module = $form[$key]; $row = array(); unset($module['enable']['#title']); - $row[] = array('class' => array('checkbox'), 'data' => drupal_render($module['enable'])); + $row[] = array( + 'class' => array('checkbox'), + 'data' => l($key, 'admin/modules', array('attributes' => array('name' => 'module-' . $key, 'class' => array('element-invisible')))) . drupal_render($module['enable']) + ); $label = ' 'Modules administration page', + 'description' => 'Tests the modules administration page', + 'group' => 'System', + ); + } + + protected $admin_user; + + function setUp() { + parent::setUp(); + + $this->admin_user = $this->drupalCreateUser(array('administer modules')); + } + + /** + * Tests linking between modules. + */ + function testLinking() { + $this->drupalLogin($this->admin_user); + $this->drupalGet('admin/modules'); + + // Get the row of the field module. + $field_module_row = $this->xpath('//input[@name="modules[Core][field][enable]"]/ancestor::tr'); + $field_module_row = $field_module_row[0]; + + // Get the divs that have the requirements. + $requirements_divs = $field_module_row->xpath('descendant::div[contains(@class, "admin-requirements")]'); + $requires_div = $requirements_divs[0]; + $required_by_div = $requirements_divs[1]; + + // The Field SQL storage module is linked as a dependency. + $field_sql_storage_link = $requires_div->xpath('a[@href="#module-field_sql_storage"]'); + $this->assertEqual($field_sql_storage_link[0][0], 'Field SQL Storage'); + + // The target anchor exists. + $this->assertFieldByXPath('//a[@name="module-field_sql_storage"]'); + + // The Field UI module is linked as 'Required by'. + $field_ui_link = $required_by_div->xpath('a[@href="#module-field_ui"]'); + $this->assertEqual($field_ui_link[0][0], 'Field UI'); + } +} + class IPAddressBlockingTestCase extends DrupalWebTestCase { protected $blocking_user;