Index: modules/simpletest/tests/module.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/module.test,v
retrieving revision 1.1
diff -u -p -r1.1 module.test
--- modules/simpletest/tests/module.test	3 Jan 2009 08:45:28 -0000	1.1
+++ modules/simpletest/tests/module.test	5 Jan 2009 09:48:53 -0000
@@ -71,3 +71,30 @@ class ModuleUnitTest extends DrupalWebTe
     $this->assertIdentical($expected_values, module_list(FALSE, TRUE), t('@condition: module_list() returns correctly sorted results', array('@condition' => $condition)));
   }
 }
+
+class ModuleUninstallTest extends DrupalWebTestCase {
+  function getInfo() {
+    return array(
+      'name' => t('Module Uninstallation'),
+      'description' => t('Checks module uninstallation'),
+      'group' => t('Module'),
+    );
+  }
+
+  function setUp() {
+    parent::setUp('module_test', 'user');
+  }
+  
+  /**
+   * Tests the hook_modules_uninstalled of the user module.
+   */
+  function testUserPermsUninstalled() {
+    // Uninstalles the module_test module, so hook_modules_uninstalled is executed.
+    drupal_uninstall_modules(array('module_test'));
+
+    // Are the perms from module_test removed from {role_permission}.
+    $count = db_query("SELECT COUNT(rid) FROM {role_permission} WHERE permission = :perm",
+      array(':perm' => 'module_test perm'))->fetchField();
+    $this->assertEqual(0, $count, t('Permissions were all removed.'));
+  }
+}
Index: modules/user/user.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.module,v
retrieving revision 1.952
diff -u -p -r1.952 user.module
--- modules/user/user.module	4 Jan 2009 16:10:48 -0000	1.952
+++ modules/user/user.module	5 Jan 2009 09:48:57 -0000
@@ -2441,3 +2441,17 @@ function _user_forms(&$edit, $account, $
   return empty($groups) ? FALSE : $groups;
 }
 
+/**
+ * Implementation of hook_modules_uninstalled().
+ */
+function user_modules_uninstalled($modules) {
+  $permissions = array();
+  foreach ($modules as $module) {
+    $permissions = array_merge($permissions, array_keys(module_invoke($module, 'perm')));
+  }
+  if (!empty($permissions)) {
+    db_delete('role_permission')
+      ->condition('permission', array_keys($permissions), 'IN')
+      ->execute();
+  }
+}
