Index: system.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.admin.inc,v
retrieving revision 1.175
diff -u -r1.175 system.admin.inc
--- modules/system/system.admin.inc	14 Aug 2009 08:09:48 -0000	1.175
+++ modules/system/system.admin.inc	14 Aug 2009 11:00:06 -0000
@@ -1297,6 +1297,14 @@
     '#description' => t('Render all blocks on the default 404 (not found) page. Disabling blocks can help with performance but might leave users with a less functional site.'),
     '#default_value' => variable_get('site_404_blocks', 0)
   );
+  $form['cron_safe_threshold'] = array(
+    '#type' => 'select',
+    '#title' => t('Automatically run cron'),
+    '#default_value' => variable_get('cron_safe_threshold', DRUPAL_DEFAULT_CRON_THRESHOLD),
+    '#options' => array(0 => t('Never')) + drupal_map_assoc(array(3600, 10800, 21600, 43200, 86400, 604800), 'format_interval'),
+    '#description' => t('When enabled, the site will check whether cron has been run in the configured interval and automatically run it upon the next page request. For more information visit the <a href="@status-report-url">status report page</a>.', array('@status-report-url' => url('admin/reports/status'))),
+  );
+
   $form['#validate'][] = 'system_site_information_settings_validate';
 
   return system_settings_form($form);
@@ -1315,6 +1323,11 @@
   if (!menu_valid_path($item)) {
     form_set_error('site_frontpage', t("The path '@path' is either invalid or you do not have access to it.", array('@path' => $item['link_path'])));
   }
+  // Clear cache when enabling or disabling the cron threshold.
+  $cron_threshold = variable_get('cron_safe_threshold', DRUPAL_DEFAULT_CRON_THRESHOLD);
+  if (($cron_threshold > 0 && $form_state['input']['cron_safe_threshold'] == 0) || ($cron_threshold == 0 && $form_state['input']['cron_safe_threshold'] > 0)) {
+    cache_clear_all();
+  }
 }
 
 /**
Index: system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.744
diff -u -r1.744 system.module
--- modules/system/system.module	13 Aug 2009 11:31:26 -0000	1.744
+++ modules/system/system.module	14 Aug 2009 14:16:16 -0000
@@ -42,6 +42,11 @@
 define('DRUPAL_MAXIMUM_TEMP_FILE_AGE', 21600);
 
 /**
+ * Default interval between automatic cron executions in seconds.
+ */
+define('DRUPAL_DEFAULT_CRON_THRESHOLD', 10800);
+
+/**
  * New users will be set to the default time zone at registration.
  */
 define('DRUPAL_USER_TIMEZONE_DEFAULT', 0);
@@ -488,6 +493,12 @@
     'access callback' => TRUE,
     'type' => MENU_CALLBACK,
   );
+  $items['system/run-cron-image'] = array(
+    'title' => 'Execute cron',
+    'page callback' => 'system_run_cron_image',
+    'access callback' => '_system_run_cron_image_access',
+    'type' => MENU_CALLBACK,
+  );
   $items['admin'] = array(
     'title' => 'Administer',
     'access arguments' => array('access administration pages'),
@@ -3034,3 +3045,58 @@
   
   return $local;
 }
+
+/**
+ * Adds triggers to run the cron via an image callback.
+ * 
+ * The triggers are added only when the feature to run cron automatically
+ * is enabled. The image will always be loaded even when the threshold is
+ * not yet crossed to prevent troubles which could occur if the page
+ * is cached.
+ */
+function system_page_alter(&$page) {
+  if (_system_run_cron_image_access()) {
+    $page['page_bottom']['run_cron'] = array(
+      // GET the image callback with XMLHttpRequest, it will work only
+      // when Javascript is available.
+      '#attached_js' => array(
+        '(function($){ $.get("'.url('system/run-cron-image').'"); })(jQuery);' => array('type' => 'inline', 'scope' => 'header'),
+      ),
+      // Image callback as HTML code for a graceful degradation when Javascript
+      // is not available.
+      '#markup' => '<noscript><div><img src="' . url('system/run-cron-image').'" alt="" /></div></noscript>',
+    );
+  }
+}
+
+/**
+ * Menu callback; executes the cron via an image callback.
+ */
+function system_run_cron_image() {
+  drupal_page_is_cacheable(FALSE);
+  
+  // Output a transparent 1x1 image to the browser.
+  drupal_set_header('Content-Type', 'image/gif');
+  echo "\x47\x49\x46\x38\x39\x61\x1\x0\x1\x0\x80\xff\x0\xc0\xc0\xc0\x0\x0\x0\x21\xf9\x4\x1\x0\x0\x0\x0\x2c\x0\x0\x0\x0\x1\x0\x1\x0\x0\x2\x2\x44\x1\x0\x3b";
+  
+  // Run the cron automatically if it has never ran or threshold was crossed.
+  $cron_last = variable_get('cron_last', NULL);
+  $cron_threshold = variable_get('cron_safe_threshold', DRUPAL_DEFAULT_CRON_THRESHOLD);
+  if (!isset($cron_last) || (REQUEST_TIME - $cron_last > $cron_threshold)) {
+    drupal_cron_run();
+  }
+  
+  exit;
+}
+
+/**
+ * Checks if the feature to run cron automatically is enabled.
+ * 
+ * Also used as a menu access callback for this feature.
+ * 
+ * @return
+ *   TRUE if the cron threshold is enabled, FALSE otherwise.
+ */
+function _system_run_cron_image_access() {
+  return variable_get('cron_safe_threshold', DRUPAL_DEFAULT_CRON_THRESHOLD) > 0;
+}

