? .project
? sites/all/themes/.DS_Store
? sites/default/.DS_Store
? sites/default/files
? sites/default/settings.php
Index: modules/comment/comment.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/comment/comment.test,v
retrieving revision 1.35
diff -u -p -r1.35 comment.test
--- modules/comment/comment.test	1 Jul 2009 12:06:21 -0000	1.35
+++ modules/comment/comment.test	8 Jul 2009 19:29:01 -0000
@@ -173,9 +173,9 @@ class CommentHelperCase extends DrupalWe
    */
   function setAnonymousUserComment($access_comments, $post_comments, $without_approval) {
     $edit = array();
-    $edit['1[access comments]'] = $access_comments;
-    $edit['1[post comments]'] = $post_comments;
-    $edit['1[post comments without approval]'] = $without_approval;
+    $edit['access__comments[1]'] = $access_comments;
+    $edit['post__comments[1]'] = $post_comments;
+    $edit['post__comments__without__approval[1]'] = $without_approval;
     $this->drupalPost('admin/user/permissions', $edit, t('Save permissions'));
     $this->assertText(t('The changes have been saved.'), t('Anonymous user comments ' . ($access_comments ? 'access comments' : 'not access comments'). '.'));
   }
Index: modules/contact/contact.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/contact/contact.test,v
retrieving revision 1.25
diff -u -p -r1.25 contact.test
--- modules/contact/contact.test	13 Jun 2009 20:40:07 -0000	1.25
+++ modules/contact/contact.test	8 Jul 2009 19:29:02 -0000
@@ -286,7 +286,7 @@ class ContactSitewideTestCase extends Dr
     // Create edit array from permission.
     $edit = array();
     foreach ($permissions as $name => $value) {
-      $edit[$rid . '[' . $name . ']'] = $value;
+      $edit[str_replace(' ', '__', $name) . '[' . $rid . ']'] = $value;
     }
 
     $this->drupalPost('admin/user/permissions', $edit, t('Save permissions'));
Index: modules/search/search.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/search/search.test,v
retrieving revision 1.24
diff -u -p -r1.24 search.test
--- modules/search/search.test	3 Jul 2009 19:21:54 -0000	1.24
+++ modules/search/search.test	8 Jul 2009 19:29:03 -0000
@@ -466,14 +466,14 @@ class SearchCommentTestCase extends Drup
     $this->drupalPost('admin/settings/formats/1', $edit, t('Save configuration'));
     // Allow anonymous users to search content.
     $edit = array(
-      DRUPAL_ANONYMOUS_RID . '[search content]' => 1,
+      'search__content[' . DRUPAL_ANONYMOUS_RID . ']' => 1,
       // @todo Comments are added to search index without checking first whether
       //   anonymous users are allowed to access comments.
-      DRUPAL_ANONYMOUS_RID . '[access comments]' => 1,
+      'access__comments[' . DRUPAL_ANONYMOUS_RID . ']' => 1,
       // @todo Without this permission, "Login or register to post comments" is
       //   added to the search index.  Comment.module is not guilty; that text
       //   seems to be added via node links.
-      DRUPAL_ANONYMOUS_RID . '[post comments]' => 1,
+      'post__comments[' . DRUPAL_ANONYMOUS_RID . ']' => 1,
     );
     $this->drupalPost('admin/user/permissions', $edit, t('Save permissions'));
 
Index: modules/system/admin.css
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/admin.css,v
retrieving revision 1.20
diff -u -p -r1.20 admin.css
--- modules/system/admin.css	14 Jan 2009 12:18:37 -0000	1.20
+++ modules/system/admin.css	8 Jul 2009 19:29:03 -0000
@@ -135,3 +135,14 @@ table.screenshot {
 html.js .custom-container label {
   visibility: hidden;
 }
+
+/**
+ * Permissions
+ */
+div.permission-wrapper {
+  padding: 0 1em;
+  margin: 0 0 1em 0;
+}
+div.permission-wrapper table {
+  margin: 0;
+}
Index: modules/user/user.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.admin.inc,v
retrieving revision 1.63
diff -u -p -r1.63 user.admin.inc
--- modules/user/user.admin.inc	6 Jul 2009 19:07:21 -0000	1.63
+++ modules/user/user.admin.inc	8 Jul 2009 19:29:05 -0000
@@ -598,43 +598,51 @@ function user_admin_permissions($form_st
   // Fetch permissions for all roles or the one selected role.
   $role_permissions = user_role_permissions($role_names);
 
-  // Store $role_names for use when saving the data.
-  $form['role_names'] = array(
-    '#type' => 'value',
-    '#value' => $role_names,
-  );
   // Render role/permission overview:
-  $options = array();
   $hide_descriptions = !system_admin_compact_mode();
+  $form['permissions'] = array(
+    '#type' => 'vertical_tabs',
+  );
   foreach (module_implements('permission') as $module) {
     if ($permissions = module_invoke($module, 'permission')) {
+      $status = array();
       $info = drupal_parse_info_file(drupal_get_path('module', $module) . "/$module.info");
-      $form['permission'][] = array(
-        '#markup' => $info['name'],
-        '#id' => $module,
-        );
+      $form['permissions'][$module] = array(
+        '#type' => 'fieldset',
+        '#title' => $info['name'],
+        '#collapsible' => TRUE,
+        '#collapsed' => TRUE,
+        '#description' => '',
+      );
       foreach ($permissions as $perm => $perm_item) {
-        $options[$perm] = '';
-        $form['permission'][$perm] = array(
-          '#type' => 'item',
+        $permission = str_replace(' ', '__', $perm);
+        $form['permissions'][$module][$permission] = array(
+          '#tree' => TRUE,
+          '#theme' => 'user_admin_permissions_fieldset',
+          '#header' => array(),
+        );
+        $form['permissions'][$module][$permission]['name'] = array(
           '#markup' => $perm_item['title'],
-          '#description' => $hide_descriptions ? $perm_item['description'] : NULL,
+        );
+        $form['permissions'][$module][$permission]['description'] = array(
+          '#markup' => $hide_descriptions ? $perm_item['description'] : NULL,
         );
         foreach ($role_names as $rid => $name) {
+          $granted = FALSE;
           // Builds arrays for checked boxes for each role
           if (isset($role_permissions[$rid][$perm])) {
-            $status[$rid][] = $perm;
+            $granted = TRUE;
           }
+          $form['permissions'][$module][$permission][$rid] = array(
+            '#type' => 'checkbox', 
+            '#title' => $name,
+            '#default_value' => $granted,
+          );
         }
       }
     }
   }
 
-  // Have to build checkboxes here after checkbox arrays are built
-  foreach ($role_names as $rid => $name) {
-    $form['checkboxes'][$rid] = array('#type' => 'checkboxes', '#options' => $options, '#default_value' => isset($status[$rid]) ? $status[$rid] : array());
-    $form['role_names'][$rid] = array('#markup' => $name, '#tree' => TRUE);
-  }
   $form['submit'] = array('#type' => 'submit', '#value' => t('Save permissions'));
 
   $form['#attached_js'] = array(drupal_get_path('module', 'user') . '/user.permissions.js');
@@ -648,20 +656,24 @@ function user_admin_permissions($form_st
  * @see user_admin_permissions()
  */
 function user_admin_permissions_submit($form, &$form_state) {
-  foreach ($form_state['values']['role_names'] as $rid => $name) {
-    $checked = array_filter($form_state['values'][$rid]);
-    // Delete existing permissions for the role. This handles "unchecking" checkboxes.
-    db_delete('role_permission')
-      ->condition('rid', $rid)
-      ->execute();
-    $query = db_insert('role_permission')->fields(array('rid', 'permission'));
-    foreach ($checked as $permission) {
-      $query->values(array(
-        'rid' => $rid,
-        'permission' => $permission,
-      ));
-    }
-    $query->execute();
+  foreach ($form_state['values'] as $perm => $values) {
+  	if (is_array($form_state['values'][$perm])) {
+      $permission_real_name = str_replace('__', ' ', $perm);
+      $checked = array_filter($form_state['values'][$perm]);
+      // Delete existing grants for this permission. This handles "unchecking" checkboxes.
+      db_delete('role_permission')
+        ->condition('permission', $permission_real_name)
+        ->execute();
+      // Insert new grants.
+      $query = db_insert('role_permission')->fields(array('rid', 'permission'));
+      foreach ($checked as $rid => $value) {
+      	$query->values(array(
+      	  'rid' => $rid,
+      	  'permission' => $permission_real_name,
+      	));
+      }
+      $query->execute();
+  	}
   }
 
   drupal_set_message(t('The changes have been saved.'));
@@ -671,36 +683,39 @@ function user_admin_permissions_submit($
 }
 
 /**
+ * Theme callback for the admin permissions form.
+ *
+ * @param $form
+ *   An associative array containing the structure of the form.
+ * @ingroup themeable
+ */
+function theme_user_admin_permissions_fieldset($form) {
+  $rows = array();
+  $output = '';
+  $output .= '<strong>' . drupal_render($form['name']) . '</strong>';
+  $output .= '<div class="permission-wrapper">';
+  $output .= '<div class="description">' . drupal_render($form['description']) . '</div>';
+  foreach (element_children($form) as $key) {
+  	if (is_numeric($key)) {
+  	  $permission = $form[$key];
+      $row = array();
+      $row[] = array('data' => drupal_render($permission));
+    	$rows[] = $row;
+  	}
+  }
+  $output .= theme('table', $form['#header'], $rows);
+  $output .= '</div>';
+  return $output;
+}
+
+/**
  * Theme the administer permissions page.
  *
  * @ingroup themeable
  */
 function theme_user_admin_permissions($form) {
-  $roles = user_roles();
-  foreach (element_children($form['permission']) as $key) {
-    $row = array();
-    // Module name
-    if (is_numeric($key)) {
-      $row[] = array('data' => drupal_render($form['permission'][$key]), 'class' => 'module', 'id' => 'module-' . $form['permission'][$key]['#id'], 'colspan' => count($form['role_names']['#value']) + 1);
-    }
-    else {
-      // Permission row.
-      $row[] = array(
-        'data' => drupal_render($form['permission'][$key]),
-        'class' => 'permission',
-      );
-      foreach (element_children($form['checkboxes']) as $rid) {
-        $row[] = array('data' => drupal_render($form['checkboxes'][$rid][$key]), 'class' => 'checkbox', 'title' => $roles[$rid] . ' : ' . t($key));
-      }
-    }
-    $rows[] = $row;
-  }
-  $header[] = (t('Permission'));
-  foreach (element_children($form['role_names']) as $rid) {
-    $header[] = array('data' => drupal_render($form['role_names'][$rid]), 'class' => 'checkbox');
-  }
   $output = theme('system_compact_link');
-  $output .= theme('table', $header, $rows, array('id' => 'permissions'));
+  $output .= drupal_render($form['permissions']);
   $output .= drupal_render_children($form);
   return $output;
 }
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.1008
diff -u -p -r1.1008 user.module
--- modules/user/user.module	5 Jul 2009 18:07:04 -0000	1.1008
+++ modules/user/user.module	8 Jul 2009 19:29:10 -0000
@@ -61,6 +61,10 @@ function user_theme() {
       'arguments' => array('form' => NULL),
       'file' => 'user.admin.inc',
     ),
+    'user_admin_permissions_fieldset' => array(
+      'arguments' => array('form' => NULL),
+      'file' => 'user.admin.inc',
+    ),
     'user_admin_new_role' => array(
       'arguments' => array('form' => NULL),
       'file' => 'user.admin.inc',
Index: modules/user/user.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.test,v
retrieving revision 1.44
diff -u -p -r1.44 user.test
--- modules/user/user.test	1 Jul 2009 12:06:22 -0000	1.44
+++ modules/user/user.test	8 Jul 2009 19:29:12 -0000
@@ -751,7 +751,7 @@ class UserPermissionsTestCase extends Dr
     // Add a permission.
     $this->assertFalse(user_access('administer nodes', $account, TRUE), t('User does not have "administer nodes" permission.'));
     $edit = array();
-    $edit[$rid . '[administer nodes]'] = TRUE;
+    $edit['administer__nodes[' . $rid . ']'] = TRUE;
     $this->drupalPost('admin/user/permissions', $edit, t('Save permissions'));
     $this->assertText(t('The changes have been saved.'), t('Successful save message displayed.'));
     $this->assertTrue(user_access('administer nodes', $account, TRUE), t('User now has "administer nodes" permission.'));
@@ -759,7 +759,7 @@ class UserPermissionsTestCase extends Dr
     // Remove a permission.
     $this->assertTrue(user_access('access user profiles', $account, TRUE), t('User has "access user profiles" permission.'));
     $edit = array();
-    $edit[$rid . '[access user profiles]'] = FALSE;
+    $edit['access__user__profiles[' . $rid . ']'] = FALSE;
     $this->drupalPost('admin/user/permissions', $edit, t('Save permissions'));
     $this->assertText(t('The changes have been saved.'), t('Successful save message displayed.'));
     $this->assertFalse(user_access('access user profiles', $account, TRUE), t('User no longer has "access user profiles" permission.'));
