diff options
-rw-r--r-- | includes/common.inc | 14 | ||||
-rw-r--r-- | includes/theme.inc | 3 | ||||
-rw-r--r-- | modules/forum/forum.module | 2 | ||||
-rw-r--r-- | modules/node/node.module | 4 | ||||
-rw-r--r-- | modules/simpletest/tests/common.test | 82 |
5 files changed, 96 insertions, 9 deletions
diff --git a/includes/common.inc b/includes/common.inc index f1b153781..42b639504 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -348,7 +348,7 @@ function drupal_get_html_head() { * This function can be called as long the HTML header hasn't been sent. * * @param $url - * A url for the feed. + * An internal system path or a fully qualified external URL of the feed. * @param $title * The title of the feed. */ @@ -358,10 +358,14 @@ function drupal_add_feed($url = NULL, $title = '') { if (isset($url)) { $stored_feed_links[$url] = theme('feed_icon', array('url' => $url, 'title' => $title)); - drupal_add_html_head_link(array('rel' => 'alternate', - 'type' => 'application/rss+xml', - 'title' => $title, - 'href' => $url)); + drupal_add_html_head_link(array( + 'rel' => 'alternate', + 'type' => 'application/rss+xml', + 'title' => $title, + // Force the URL to be absolute, for consistency with other <link> tags + // output by Drupal. + 'href' => url($url, array('absolute' => TRUE)), + )); } return $stored_feed_links; } diff --git a/includes/theme.inc b/includes/theme.inc index 4d8e054d7..f3ace1368 100644 --- a/includes/theme.inc +++ b/includes/theme.inc @@ -1866,7 +1866,8 @@ function theme_more_help_link($variables) { * * @param $variables * An associative array containing: - * - url: The url of the feed. + * - url: An internal system path or a fully qualified external URL of the + * feed. * - title: A descriptive title of the feed. */ function theme_feed_icon($variables) { diff --git a/modules/forum/forum.module b/modules/forum/forum.module index 10076a9cd..fffd0c76d 100644 --- a/modules/forum/forum.module +++ b/modules/forum/forum.module @@ -990,7 +990,7 @@ function template_preprocess_forums(&$variables) { if ($variables['tid'] && !in_array($variables['tid'], variable_get('forum_containers', array()))) { $variables['topics'] = theme('forum_topic_list', $variables); - drupal_add_feed('taxonomy/term/' . $variables['tid'] . '/0/feed', 'RSS - ' . $title); + drupal_add_feed('taxonomy/term/' . $variables['tid'] . '/feed', 'RSS - ' . $title); } else { $variables['topics'] = ''; diff --git a/modules/node/node.module b/modules/node/node.module index 9a5651350..44a2274d1 100644 --- a/modules/node/node.module +++ b/modules/node/node.module @@ -2537,8 +2537,8 @@ function node_page_default() { $nodes = node_load_multiple($nids); $build = node_view_multiple($nodes); - $feed_url = url('rss.xml', array('absolute' => TRUE)); - drupal_add_feed($feed_url, variable_get('site_name', 'Drupal') . ' ' . t('RSS')); + // 'rss.xml' is a path, not a file, registered in node_menu(). + drupal_add_feed('rss.xml', variable_get('site_name', 'Drupal') . ' ' . t('RSS')); $build['pager'] = array( '#theme' => 'pager', '#weight' => 5, diff --git a/modules/simpletest/tests/common.test b/modules/simpletest/tests/common.test index 6c1492e75..5fca979d9 100644 --- a/modules/simpletest/tests/common.test +++ b/modules/simpletest/tests/common.test @@ -2277,3 +2277,85 @@ class DrupalGetRdfNamespacesTestCase extends DrupalWebTestCase { $this->assertTrue(!isset($ns['dc']), t('A prefix with conflicting namespaces is discarded.')); } } + +/** + * Basic tests for drupal_add_feed(). + */ +class DrupalAddFeedTestCase extends DrupalWebTestCase { + public static function getInfo() { + return array( + 'name' => 'drupal_add_feed() tests', + 'description' => 'Make sure that drupal_add_feed() works correctly with various constructs.', + 'group' => 'System', + ); + } + + /** + * Test drupal_add_feed() with paths, URLs, and titles. + */ + function testBasicFeedAddNoTitle() { + $path = $this->randomName(12); + $external_url = 'http://' . $this->randomName(12) . '/' . $this->randomName(12); + $fully_qualified_local_url = url($this->randomName(12), array('absolute' => TRUE)); + + $path_for_title = $this->randomName(12); + $external_for_title = 'http://' . $this->randomName(12) . '/' . $this->randomName(12); + $fully_qualified_for_title = url($this->randomName(12), array('absolute' => TRUE)); + + // Possible permutations of drupal_add_feed() to test. + // - 'input_url': the path passed to drupal_add_feed(), + // - 'output_url': the expected URL to be found in the header. + // - 'title' == the title of the feed as passed into drupal_add_feed(). + $urls = array( + 'path without title' => array( + 'input_url' => $path, + 'output_url' => url($path, array('absolute' => TRUE)), + 'title' => '', + ), + 'external url without title' => array( + 'input_url' => $external_url, + 'output_url' => $external_url, + 'title' => '', + ), + 'local url without title' => array( + 'input_url' => $fully_qualified_local_url, + 'output_url' => $fully_qualified_local_url, + 'title' => '', + ), + 'path with title' => array( + 'input_url' => $path_for_title, + 'output_url' => url($path_for_title, array('absolute' => TRUE)), + 'title' => $this->randomName(12), + ), + 'external url with title' => array( + 'input_url' => $external_for_title, + 'output_url' => $external_for_title, + 'title' => $this->randomName(12), + ), + 'local url with title' => array( + 'input_url' => $fully_qualified_for_title, + 'output_url' => $fully_qualified_for_title, + 'title' => $this->randomName(12), + ), + ); + + foreach ($urls as $description => $feed_info) { + drupal_add_feed($feed_info['input_url'], $feed_info['title']); + } + + $this->drupalSetContent(drupal_get_html_head()); + foreach ($urls as $description => $feed_info) { + $this->assertPattern($this->urlToRSSLinkPattern($feed_info['output_url'], $feed_info['title']), t('Found correct feed header for %description', array('%description' => $description))); + } + } + + /** + * Create a pattern representing the RSS feed in the page. + */ + function urlToRSSLinkPattern($url, $title = '') { + // Escape any regular expression characters in the url ('?' is the worst). + $url = preg_replace('/([+?.*])/', '[$0]', $url); + $generated_pattern = '%<link +rel="alternate" +type="application/rss.xml" +title="' . $title . '" +href="' . $url . '" */>%'; + return $generated_pattern; + } +} |