diff --git modules/menu/menu.admin.inc modules/menu/menu.admin.inc index 06b3eb3..4d7fa42 100644 --- modules/menu/menu.admin.inc +++ modules/menu/menu.admin.inc @@ -297,6 +297,9 @@ function menu_edit_item($form, &$form_state, $type, $item, $menu) { '#access' => $item['mlid'], '#submit' => array('menu_item_delete_submit'), '#weight' => 10, + // Keep array('mlid') for passing mlid of the + // menu link item to delete confirmation form. + '#limit_validation_errors' => array(array('mlid')), ); } else { @@ -477,6 +480,9 @@ function menu_edit_menu($form, &$form_state, $type, $menu = array()) { '#value' => t('Delete'), '#access' => $type == 'edit' && !isset($system_menus[$menu['menu_name']]), '#submit' => array('menu_custom_delete_submit'), + // Keep array('menu_name') for passing menu_name of the + // menu item to delete confirmation form. + '#limit_validation_errors' => array(array('menu_name')), ); return $form; diff --git modules/menu/menu.test modules/menu/menu.test index a2c4ebd..072e6b1 100644 --- modules/menu/menu.test +++ modules/menu/menu.test @@ -61,6 +61,24 @@ class MenuTestCase extends DrupalWebTestCase { // Delete custom menu. $this->deleteCustomMenu($this->menu); + // Delete menu submitting empty title on edit form. + // Check if validation permits to do this. + $menu_name = substr(hash('sha256', $this->randomName(16)), 0, MENU_MAX_MENU_NAME_LENGTH_UI); + $title = $this->randomName(16); + + $menu = array( + 'menu_name' => $menu_name, + 'title' => $title, + 'description' => 'Description text', + ); + menu_save($menu); + $edit = array( + 'title' => '', + ); + + $this->drupalPost('admin/structure/menu/manage/' . $menu_name . '/edit', $edit, t('Delete')); + $this->assertNoText(t('Title field is required.'), t('Delete menu on edit form with empty title.')); + // Modify and reset a standard menu link. $item = $this->getStandardMenuLink(); $old_title = $item['link_title']; @@ -73,6 +91,35 @@ class MenuTestCase extends DrupalWebTestCase { $saved_item = menu_link_load($item['mlid']); $this->assertEqual($description, $saved_item['options']['attributes']['title'], t('Saving an existing link updates the description (title attribute)')); $this->resetMenuLink($item, $old_title); + + // Delete link submitting empty title or path on edit form. + // Check if validation permits to do this. + // Login the user. + $this->drupalLogin($this->big_user); + // Create custom link to User menu. + $link_title = $this->randomName(); + $edit = array( + 'link_title' => $link_title, + 'link_path' => '', + ); + $this->drupalPost('admin/structure/menu/manage/user-menu/add', $edit, t('Save')); + // Select mlid of new created menu item. + $mlid = db_query("SELECT mlid FROM {menu_links} WHERE link_title = :link_title", array(':link_title' => $link_title))->fetchField(); + // Submit edit form with empty title. + $edit = array( + 'link_title' => '', + 'link_path' => '', + ); + $this->drupalPost('admin/structure/menu/item/' . $mlid . '/edit', $edit, t('Delete')); + $this->assertNoText(t('Menu link title field is required.'), t('Delete link on edit form with empty title.')); + + // Submit edit form with empty path. + $edit = array( + 'link_title' => $link_title, + 'link_path' => '', + ); + $this->drupalPost('admin/structure/menu/item/' . $mlid . '/edit', $edit, t('Delete')); + $this->assertNoText(t('Path field is required.'), t('Delete link on edit form with empty path.')); } /** diff --git modules/node/node.pages.inc modules/node/node.pages.inc index 84d01cb..e34d604 100644 --- modules/node/node.pages.inc +++ modules/node/node.pages.inc @@ -286,6 +286,9 @@ function node_form($form, &$form_state, $node) { '#value' => t('Delete'), '#weight' => 15, '#submit' => array('node_form_delete_submit'), + // Keep array('nid') for passing nid of the node + // to delete confirmation form + '#limit_validation_errors' => array(array('nid')), ); } // This form uses a button-level #submit handler for the form's main submit diff --git modules/node/node.test modules/node/node.test index f346772..055446c 100644 --- modules/node/node.test +++ modules/node/node.test @@ -390,6 +390,55 @@ class PageEditTestCase extends DrupalWebTestCase { } } +class NodeDeleteTestCase extends DrupalWebTestCase { + protected $web_user; + + public static function getInfo() { + return array( + 'name' => 'Node delete', + 'description' => 'Create a node and test node delete functionality.', + 'group' => 'Node', + ); + } + + function setUp() { + parent::setUp(); + + $this->web_user = $this->drupalCreateUser(array('edit own page content', 'create page content', 'delete own page content')); + } + + /** + * Check deleting node from edit form with empty title. + */ + function testNodeDeleteEmptyTitle() { + $this->drupalLogin($this->web_user); + + $langcode = LANGUAGE_NONE; + $title_key = "title"; + $body_key = "body[$langcode][0][value]"; + // Create node to delete. + $edit = array(); + $edit[$title_key] = $this->randomName(8); + $edit[$body_key] = $this->randomName(16); + $this->drupalPost('node/add/page', $edit, t('Save')); + + // Load created node. + $node = $this->drupalGetNodeByTitle($edit[$title_key]); + + // Delete the node through edit form. + $edit = array(); + $edit[$title_key] = ''; + $edit[$body_key] = $this->randomName(16); + // Use Delete button on edit form taking off the title. + $this->drupalPost("node/$node->nid/edit", $edit, t('Delete')); + + // Check that node edit form can be submitted + // with Delete button and empty title. + $this->assertNoText(t('Title field is required.'), t('Delete button works with empty title on edit form.')); + + } +} + class PagePreviewTestCase extends DrupalWebTestCase { public static function getInfo() { return array( diff --git modules/path/path.admin.inc modules/path/path.admin.inc index 7e79293..829a9cd 100644 --- modules/path/path.admin.inc +++ modules/path/path.admin.inc @@ -151,6 +151,9 @@ function path_admin_form($form, &$form_state, $path = array('source' => '', 'ali '#type' => 'submit', '#value' => t('Delete'), '#submit' => array('path_admin_form_delete_submit'), + // Keep array('pid') for passing pid of the + // url alias record to delete confirmation form. + '#limit_validation_errors' => array(array('pid')), ); } diff --git modules/path/path.test modules/path/path.test index 9666466..7adfa7b 100644 --- modules/path/path.test +++ modules/path/path.test @@ -160,6 +160,41 @@ class PathTestCase extends DrupalWebTestCase { $this->assertResponse(404); } + /** + * Delete alias through alias edit form. + */ + function testDeleteAlias() { + // Create alias. + $alias = $this->randomName(); + $edit = array( + 'source' => '', + 'alias' => $alias, + ); + $this->drupalPost('admin/config/search/path/add', $edit, t('Save')); + + // Select pid of new created alias. + $query = db_select('url_alias'); + $query->addField('url_alias', 'pid'); + $query->condition('alias', $alias); + $pid = $query->execute()->fetchField(); + + // Delete submit with empty source field. + $edit = array( + 'source' => '', + 'alias' => $alias, + ); + $this->drupalPost('admin/config/search/path/edit/' . $pid, $edit, t('Delete')); + $this->assertNoText(t('Existing system path field is required.'), t('Delete alias on edit form with empty source field.')); + + // Delete submit with empty alias field. + $edit = array( + 'source' => '', + 'alias' => '', + ); + $this->drupalPost('admin/config/search/path/edit/' . $pid, $edit, t('Delete')); + $this->assertNoText(t('Path alias field is required.'), t('Delete alias on edit form with empty alias field.')); + } + function getPID($alias) { return db_query("SELECT pid FROM {url_alias} WHERE alias = :alias", array(':alias' => $alias))->fetchField(); } diff --git modules/user/user.admin.inc modules/user/user.admin.inc index 87fd06e..3d9e40d 100644 --- modules/user/user.admin.inc +++ modules/user/user.admin.inc @@ -960,6 +960,9 @@ function user_admin_role($form, $form_state, $role) { '#type' => 'submit', '#value' => t('Delete role'), '#submit' => array('user_admin_role_delete_submit'), + // Keep array('rid') for passing rid of the role + // to delete confirmation form + '#limit_validation_errors' => array(array('rid')), ); return $form; diff --git modules/user/user.test modules/user/user.test index 65105e8..80b30c1 100644 --- modules/user/user.test +++ modules/user/user.test @@ -1786,6 +1786,11 @@ class UserRoleAdminTestCase extends DrupalWebTestCase { $this->assertFalse(user_role_load_by_name($old_name), t('The role can no longer be retrieved from the database using its old name.')); $this->assertTrue(is_object(user_role_load_by_name($role_name)), t('The role can be retrieved from the database using its new name.')); + // Test submit edit role form with empty role name. + $edit = array('name' => ''); + $this->drupalPost("admin/people/permissions/roles/edit/{$role->rid}", $edit, t('Delete role')); + $this->assertNoText(t('Role name field is required.'), t('Role can be deleted with empty name submitted to the form.')); + // Test deleting a role. $this->drupalPost("admin/people/permissions/roles/edit/{$role->rid}", NULL, t('Delete role')); $this->drupalPost(NULL, NULL, t('Delete'));