Index: modules/aggregator/aggregator.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.admin.inc,v
retrieving revision 1.50
diff -u -p -r1.50 aggregator.admin.inc
--- modules/aggregator/aggregator.admin.inc	27 Feb 2010 15:05:19 -0000	1.50
+++ modules/aggregator/aggregator.admin.inc	11 Apr 2010 16:44:35 -0000
@@ -59,6 +59,7 @@ function aggregator_view() {
  * @ingroup forms
  * @see aggregator_form_feed_validate()
  * @see aggregator_form_feed_submit()
+ * @see aggregator_form_feed_delete_submit()
  */
 function aggregator_form_feed($form, &$form_state, stdClass $feed = NULL) {
   $period = drupal_map_assoc(array(900, 1800, 3600, 7200, 10800, 21600, 32400, 43200, 64800, 86400, 172800, 259200, 604800, 1209600, 2419200), 'format_interval');
@@ -118,6 +119,7 @@ function aggregator_form_feed($form, &$f
     $form['delete'] = array(
       '#type' => 'submit',
       '#value' => t('Delete'),
+      '#submit' => array('aggregator_form_feed_delete_submit'),
     );
     $form['fid'] = array(
       '#type' => 'hidden',
@@ -157,8 +159,6 @@ function aggregator_form_feed_validate($
 
 /**
  * Process aggregator_form_feed() form submissions.
- *
- * @todo Add delete confirmation dialog.
  */
 function aggregator_form_feed_submit($form, &$form_state) {
   if ($form_state['values']['op'] == t('Delete')) {
@@ -179,18 +179,6 @@ function aggregator_form_feed_submit($fo
         return;
       }
     }
-    else {
-      watchdog('aggregator', 'Feed %feed deleted.', array('%feed' => $title));
-      drupal_set_message(t('The feed %feed has been deleted.', array('%feed' => $title)));
-      if (arg(0) == 'admin') {
-        $form_state['redirect'] = 'admin/config/services/aggregator/';
-        return;
-      }
-      else {
-        $form_state['redirect'] = 'aggregator/sources/';
-        return;
-      }
-    }
   }
   else {
     watchdog('aggregator', 'Feed %feed added.', array('%feed' => $form_state['values']['title']), WATCHDOG_NOTICE, l(t('view'), 'admin/config/services/aggregator'));
@@ -198,6 +186,39 @@ function aggregator_form_feed_submit($fo
   }
 }
 
+/**
+ * Form submit handler for the aggregator_form_feed() form.
+ */
+function aggregator_form_feed_delete_submit($form, &$form_state) {
+  $form_state['redirect'] = 'admin/config/services/aggregator/delete/feed/' . $form_state['values']['fid'];
+}
+
+/**
+ * Form to confirm feed delete operation.
+ */
+function aggregator_form_feed_delete_confirm($form, &$form_state, $feed) {
+  $form['fid'] = array(
+    '#type' => 'value',
+    '#value' => $feed->fid,
+  );
+  $path = (arg(0) == 'admin') ? 'admin/config/services/aggregator' : 'aggregator/sources';
+  return confirm_form($form, t('Are you sure you want to delete the feed %name ?', array('%name' => $feed->title)), $path, t('This action cannot be undone.'), t('Delete'));
+}
+
+/**
+ * Form submit handler for aggregator_form_feed_delete_confirm().
+ */
+function aggregator_form_feed_delete_confirm_submit($form, &$form_state) {
+  $feed = (array) aggregator_feed_load($form_state['values']['fid']);
+  $title = $feed['title'];
+  // Unset the title.
+  unset($feed['title']);
+  aggregator_save_feed($feed);
+  watchdog('aggregator', 'Feed %feed deleted.', array('%feed' => $title));
+  drupal_set_message(t('The feed %feed has been deleted.', array('%feed' => $title)));
+  $form_state['redirect'] = (arg(0) == 'admin') ? 'admin/config/services/aggregator/' : 'aggregator/sources/';
+}
+
 function aggregator_admin_remove_feed($form, $form_state, $feed) {
   return confirm_form(
     array(
Index: modules/aggregator/aggregator.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.module,v
retrieving revision 1.437
diff -u -p -r1.437 aggregator.module
--- modules/aggregator/aggregator.module	24 Mar 2010 08:51:42 -0000	1.437
+++ modules/aggregator/aggregator.module	11 Apr 2010 16:44:35 -0000
@@ -260,6 +260,14 @@ function aggregator_menu() {
     'type' => MENU_CALLBACK,
     'file' => 'aggregator.admin.inc',
   );
+  $items['admin/config/services/aggregator/delete/feed/%aggregator_feed'] = array(
+    'title' => 'Delete feed',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('aggregator_form_feed_delete_confirm', 6),
+    'access arguments' => array('administer news feeds'),
+    'type' => MENU_CALLBACK,
+    'file' => 'aggregator.admin.inc',
+  );
   $items['admin/config/services/aggregator/edit/category/%aggregator_category'] = array(
     'title' => 'Edit category',
     'page callback' => 'drupal_get_form',
Index: modules/aggregator/aggregator.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/aggregator/aggregator.test,v
retrieving revision 1.39
diff -u -p -r1.39 aggregator.test
--- modules/aggregator/aggregator.test	24 Mar 2010 08:51:42 -0000	1.39
+++ modules/aggregator/aggregator.test	11 Apr 2010 16:44:36 -0000
@@ -41,6 +41,7 @@ class AggregatorTestCase extends DrupalW
    */
   function deleteFeed($feed) {
     $this->drupalPost('admin/config/services/aggregator/edit/feed/' . $feed->fid, array(), t('Delete'));
+    $this->drupalPost(NULL, NULL, t('Delete'));
     $this->assertRaw(t('The feed %title has been deleted.', array('%title' => $feed->title)), t('Feed deleted successfully.'));
   }
 
