Index: privatemsg.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/privatemsg.module,v
retrieving revision 1.70.2.30.2.91.2.76
diff -u -p -r1.70.2.30.2.91.2.76 privatemsg.module
--- privatemsg.module	14 Oct 2009 15:24:44 -0000	1.70.2.30.2.91.2.76
+++ privatemsg.module	21 Oct 2009 21:19:26 -0000
@@ -136,10 +136,10 @@ function privatemsg_menu() {
     'type'             => MENU_LOCAL_TASK,
     'weight'           => -5,
   );
-  $items['messages/delete/%'] = array(
+  $items['messages/delete/%privatemsg_thread/%_privatemsg'] = array(
     'title'            => 'Delete message',
     'page callback'    => 'drupal_get_form',
-    'page arguments'   => array('privatemsg_delete', 2),
+    'page arguments'   => array('privatemsg_delete', 2, 3),
     'access callback'  => 'privatemsg_user_access',
     'access arguments' => array('delete privatemsg'),
     'type'             => MENU_CALLBACK,
@@ -498,7 +498,8 @@ function privatemsg_preprocess_privatems
 //  drupal_set_message('<pre>'. print_r($vars,1 ) . '</pre>');
 
   $message = $vars['message'];
-  $vars['mid'] = isset($message['mid']) ? $message['mid']:null;
+  $vars['mid'] = isset($message['mid']) ? $message['mid'] : NULL;
+  $vars['thread_id'] = isset($message['thread_id']) ? $message['thread_id'] : NULL;
   $vars['author_picture'] = theme('user_picture', $message['author']);
   $vars['author_name_link'] = theme('username', $message['author']);
   /**
@@ -506,8 +507,8 @@ function privatemsg_preprocess_privatems
    */
   $vars['message_timestamp'] = format_date($message['timestamp'], 'small');
   $vars['message_body'] = check_markup($message['body'], $message['format']);
-  if (isset($vars['mid']) && privatemsg_user_access('delete privatemsg')) {
-    $vars['message_actions'][] = array('title' => t('Delete message'), 'href' => 'messages/delete/' . $vars['mid']);
+  if (isset($vars['mid']) && isset($vars['thread_id']) && privatemsg_user_access('delete privatemsg')) {
+    $vars['message_actions'][] = array('title' => t('Delete message'), 'href' => 'messages/delete/' . $vars['thread_id'] . '/' . $vars['mid']);
   }
   $vars['message_anchors'][] = 'privatemsg-mid-' . $vars['mid'];
   if (!empty($message['is_new'])) {
@@ -1068,6 +1069,7 @@ function privatemsg_sql_load(&$fragments
   $fragments['select'][]      = "pm.timestamp";
   $fragments['select'][]      = "pm.format";
   $fragments['select'][]      = "pmi.is_new";
+  $fragments['select'][]      = "pmi.thread_id";
 
   $fragments['inner_join'][]  = 'INNER JOIN {pm_index} pmi ON pm.mid = pmi.mid';
   $fragments['where'][]       = 'pmi.mid = %d';
@@ -1309,12 +1311,16 @@ function _privatemsg_block_menu() {
   return $block;
 }
 
-function privatemsg_delete($form_state, $pmid) {
-
+function privatemsg_delete($form_state, $thread, $message) {
   $form['pmid'] = array(
     '#type' => 'value',
-    '#value' => $pmid,
+    '#value' => $message['mid'],
+  );
+  $form['delete_destination'] = array(
+    '#type' => 'value',
+    '#value' => count($thread['messages']) > 1 ? 'messages/view/' . $message['thread_id'] : 'messages',
   );
+
   if (privatemsg_user_access('read all private messages')) {
     $form['delete_options'] = array(
       '#type' => 'checkbox',
@@ -1325,7 +1331,7 @@ function privatemsg_delete($form_state, 
   }
   return confirm_form($form,
     t('Are you sure you want to delete this message?'),
-    isset($_GET['destination']) ? $_GET['destination'] : 'messages/view/'. $pmid,
+    isset($_GET['destination']) ? $_GET['destination'] : 'messages/view/'. $message['thread_id'],
     t('This action cannot be undone.'),
     t('Delete'),
     t('Cancel')
@@ -1337,16 +1343,16 @@ function privatemsg_delete_submit($form,
   $account = drupal_clone($user);
   
   if ($form_state['values']['confirm']) {
-    if ($form_state['values']['delete_options']) {
+    if (isset($form_state['values']['delete_options']) && $form_state['values']['delete_options']) {
       privatemsg_message_change_delete($form_state['values']['pmid'], 1);
-      drupal_set_message(t('Message has been deleted for all users'));
+      drupal_set_message(t('Message has been deleted for all users.'));
     }
     else {
       privatemsg_message_change_delete($form_state['values']['pmid'], 1, $account);
-      drupal_set_message(t('Message has been deleted'));
+      drupal_set_message(t('Message has been deleted.'));
     }
   }
-  $form_state['redirect'] = 'messages';
+  $form_state['redirect'] = $form_state['values']['delete_destination'];
 }
 
 /**
Index: privatemsg.test
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/privatemsg.test,v
retrieving revision 1.2.2.3
diff -u -p -r1.2.2.3 privatemsg.test
--- privatemsg.test	12 Oct 2009 17:58:26 -0000	1.2.2.3
+++ privatemsg.test	21 Oct 2009 21:19:27 -0000
@@ -221,6 +221,87 @@ class PrivatemsgTestCase extends DrupalW
     $this->assertTrue(empty($message), t('Message #4 has been flushed'));
   }
 
+  function testDelete() {
+    // Create users.
+    $author = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg', 'delete privatemsg'));
+    $recipient = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg', 'delete privatemsg'));
+    $recipient2 = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg'));
+    $admin = $this->drupalCreateUser(array('write privatemsg', 'read privatemsg', 'delete privatemsg', 'read all private messages'));
+
+    // Create texts.
+    $subject = $this->randomName(20);
+    $body1 = $this->randomName(100);
+    $body2 = $this->randomName(100);
+
+    // Create message and response.
+    $return = privatemsg_new_thread(array($recipient, $recipient2), $subject, $body1, array('author' => $author));
+    privatemsg_reply($return['message']['thread_id'], $body2, array('author' => $recipient));
+
+    // Check with user without delete permission.
+    $this->drupalLogin($recipient2);
+    $this->drupalGet('messages/view/' . $return['message']['thread_id']);
+    $this->assertText($subject, 'Subject is displayed');
+    $this->assertText($body1, 'First message is displayed');
+    $this->assertText($body2, 'Second message is displayed');
+    $this->assertNoText(t('Delete message'), 'Delete message is link is not displayed for user without permission');
+
+    // Check if access for that user is denied.
+    $this->drupalGet('messages/delete/' . $return['message']['thread_id'] . '/' . $return['message']['mid']);
+    $this->assertText(t('Access denied'));
+
+    // Check with user with delete access.
+    $this->drupalLogin($recipient);
+    $this->drupalGet('messages/view/' . $return['message']['thread_id']);
+    $this->assertText(t('Delete message'), 'Delete message is link is displayed for user without permission');
+
+    // Click delete link of the second message and cancel.
+    $this->clickLink(t('Delete message'), 1);
+    $this->assertText(t('Are you sure you want to delete this message?'), 'Confirmation message displayed');
+    $this->clickLink(t('Cancel'));
+    $this->assertText($body2, 'Second message is still displayed');
+
+    // Confirm message deletion.
+    $this->clickLink(t('Delete message'), 1);
+    $this->assertText(t('Are you sure you want to delete this message?'), 'Confirmation message displayed');
+    $this->drupalPost(NULL, array(), t('Delete'));
+    $this->assertText(t('Message has been deleted.'), 'Message deleted has been deleted');
+    $this->assertText($body1, 'First message is still displayed');
+    $this->assertNoText($body2, 'Second message was deleted');
+    
+    // Click delete link of the first message and cancel.
+    $this->clickLink(t('Delete message'));
+    $this->assertText(t('Are you sure you want to delete this message?'), 'Confirmation message displayed');
+    $this->clickLink(t('Cancel'));
+    $this->assertText($body1, 'Second message is still displayed');
+
+    // Confirm message deletion.
+    $this->clickLink(t('Delete message'));
+    $this->assertText(t('Are you sure you want to delete this message?'), 'Confirmation message displayed');
+    $this->drupalPost(NULL, array(), t('Delete'));
+    $this->assertText(t('Message has been deleted.'), 'Message deleted has been deleted');
+    $this->assertNoText($subject, 'All messages of that thread have been deleted');
+
+    // Test if the message has not been deleted for other users.
+    $this->drupalLogin($recipient2);
+    $this->drupalGet('messages/view/' . $return['message']['thread_id']);
+    $this->assertText($body1, 'First message is still displayed');
+    $this->assertText($body2,'First message is still displayed');
+
+    // Test delete all checkbox.
+    $this->drupalLogin($admin);
+    $this->drupalGet('messages/view/' . $return['message']['thread_id']);
+    $this->clickLink(t('Delete message'), 1);
+    $this->drupalPost(NULL, array('delete_options' => TRUE), t('Delete'));
+    $this->assertText(t('Message has been deleted for all users.'), 'Message deleted has been deleted');
+
+    // Test if the message has been deleted for all users.
+    $this->drupalLogin($recipient2);
+    $this->drupalGet('messages/view/' . $return['message']['thread_id']);
+    $this->assertText($body1, 'First message is still displayed');
+    $this->assertNoText($body2, 'Second message has been deleted for all users');
+
+  }
+
   /**
    * Implementation of tearDown().
    */
Index: pm_block_user/pm_block_user.module
===================================================================
RCS file: /cvs/drupal/contributions/modules/privatemsg/pm_block_user/pm_block_user.module,v
retrieving revision 1.1.2.9
diff -u -p -r1.1.2.9 pm_block_user.module
--- pm_block_user/pm_block_user.module	4 Oct 2009 22:48:42 -0000	1.1.2.9
+++ pm_block_user/pm_block_user.module	21 Oct 2009 21:19:28 -0000
@@ -542,7 +542,6 @@ function pm_block_user_privatemsg_block_
 
 function pm_block_user_privatemsg_sql_load_alter(&$fragments, $pmid, $uid) {
   $fragments['select'][] = 'pmbu.recipient AS is_blocked';
-  $fragments['select'][] = 'pmi.thread_id';
 
   $fragments['inner_join'][] = 'LEFT JOIN {pm_block_user} pmbu ON (pm.author = pmbu.author AND pmi.uid = pmbu.recipient)';
 }
