summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/aggregator/aggregator.admin.inc2
-rw-r--r--modules/aggregator/aggregator.api.php33
-rw-r--r--modules/aggregator/aggregator.install54
-rw-r--r--modules/aggregator/aggregator.module7
-rw-r--r--modules/aggregator/aggregator.processor.inc3
-rw-r--r--modules/aggregator/aggregator.test158
-rw-r--r--modules/aggregator/tests/aggregator_test_rss091.xml11
-rw-r--r--modules/block/block.api.php1
-rw-r--r--modules/book/book.admin.inc2
-rw-r--r--modules/book/book.js6
-rw-r--r--modules/comment/comment-wrapper.tpl.php3
-rw-r--r--modules/comment/comment.module11
-rw-r--r--modules/comment/comment.test372
-rw-r--r--modules/comment/comment.tpl.php2
-rw-r--r--modules/dblog/dblog.test2
-rw-r--r--modules/field/field.api.php20
-rw-r--r--modules/field/field.form.inc35
-rw-r--r--modules/field/field.info.inc9
-rw-r--r--modules/field/field.install10
-rw-r--r--modules/field/field.module2
-rw-r--r--modules/field/modules/field_sql_storage/field_sql_storage.install2
-rw-r--r--modules/field/theme/field.tpl.php2
-rw-r--r--modules/file/file.api.php6
-rw-r--r--modules/file/file.js9
-rw-r--r--modules/forum/forum.module12
-rw-r--r--modules/forum/forum.test8
-rw-r--r--modules/image/image.field.inc13
-rw-r--r--modules/image/image.module6
-rw-r--r--modules/image/image.test106
-rw-r--r--modules/image/tests/image_module_test.module11
-rw-r--r--modules/locale/locale.install15
-rw-r--r--modules/locale/locale.module2
-rw-r--r--modules/locale/locale.test12
-rw-r--r--modules/menu/menu.admin.inc9
-rw-r--r--modules/node/node.api.php67
-rw-r--r--modules/node/node.install2
-rw-r--r--modules/node/node.module60
-rw-r--r--modules/node/node.test85
-rw-r--r--modules/node/node.tpl.php20
-rw-r--r--modules/node/tests/node_test.module10
-rw-r--r--modules/openid/openid.inc2
-rw-r--r--modules/openid/openid.module6
-rw-r--r--modules/openid/openid.pages.inc1
-rw-r--r--modules/openid/openid.test12
-rw-r--r--modules/overlay/overlay-child-rtl.css5
-rw-r--r--modules/overlay/overlay-child.css5
-rw-r--r--modules/overlay/overlay-child.js4
-rw-r--r--modules/overlay/overlay-parent.css5
-rw-r--r--modules/overlay/overlay-parent.js11
-rw-r--r--modules/overlay/overlay.install4
-rw-r--r--modules/overlay/overlay.module53
-rw-r--r--modules/overlay/overlay.tpl.php2
-rw-r--r--modules/path/path.module2
-rw-r--r--modules/poll/poll-results.tpl.php2
-rw-r--r--modules/poll/poll-vote.tpl.php2
-rw-r--r--modules/poll/poll.module2
-rw-r--r--modules/poll/poll.test110
-rw-r--r--modules/profile/profile-wrapper.tpl.php2
-rw-r--r--modules/profile/profile.module2
-rw-r--r--modules/rdf/rdf.test2
-rw-r--r--modules/search/search-result.tpl.php2
-rw-r--r--modules/search/search-results.tpl.php2
-rw-r--r--modules/shortcut/shortcut.admin.js2
-rw-r--r--modules/shortcut/shortcut.module24
-rw-r--r--modules/simpletest/drupal_web_test_case.php24
-rw-r--r--modules/simpletest/simpletest.api.php2
-rw-r--r--modules/simpletest/simpletest.info7
-rw-r--r--modules/simpletest/tests/ajax_forms_test.module4
-rw-r--r--modules/simpletest/tests/common.test49
-rw-r--r--modules/simpletest/tests/database_test.test19
-rw-r--r--modules/simpletest/tests/entity_crud_hook_test.module23
-rw-r--r--modules/simpletest/tests/entity_crud_hook_test.test22
-rw-r--r--modules/simpletest/tests/form.test75
-rw-r--r--modules/simpletest/tests/form_test.module45
-rw-r--r--modules/simpletest/tests/https.php4
-rw-r--r--modules/simpletest/tests/image.test8
-rw-r--r--modules/simpletest/tests/mail.test4
-rw-r--r--modules/simpletest/tests/menu.test2
-rw-r--r--modules/simpletest/tests/module.test10
-rw-r--r--modules/simpletest/tests/requirements1_test.install2
-rw-r--r--modules/simpletest/tests/session.test8
-rw-r--r--modules/simpletest/tests/taxonomy_test.module30
-rw-r--r--modules/simpletest/tests/upgrade/drupal-6.forum.database.php14
-rw-r--r--modules/simpletest/tests/upgrade/drupal-6.menu.database.php27
-rw-r--r--modules/simpletest/tests/upgrade/drupal-7.aggregator.database.php149
-rw-r--r--modules/simpletest/tests/upgrade/drupal-7.filled.standard_all.database.php.gzbin97562 -> 97603 bytes
-rw-r--r--modules/simpletest/tests/upgrade/update.aggregator.test47
-rw-r--r--modules/simpletest/tests/upgrade/upgrade.forum.test6
-rw-r--r--modules/statistics/statistics.test92
-rw-r--r--modules/syslog/syslog.test2
-rw-r--r--modules/system/html.tpl.php2
-rw-r--r--modules/system/maintenance-page.tpl.php2
-rw-r--r--modules/system/page.tpl.php2
-rw-r--r--modules/system/region.tpl.php2
-rw-r--r--modules/system/system.admin.inc17
-rw-r--r--modules/system/system.api.php162
-rw-r--r--modules/system/system.base.css4
-rw-r--r--modules/system/system.install100
-rw-r--r--modules/system/system.module14
-rw-r--r--modules/system/theme.api.php4
-rw-r--r--modules/taxonomy/taxonomy-term.tpl.php4
-rw-r--r--modules/taxonomy/taxonomy.api.php24
-rw-r--r--modules/taxonomy/taxonomy.install2
-rw-r--r--modules/taxonomy/taxonomy.module153
-rw-r--r--modules/taxonomy/taxonomy.pages.inc17
-rw-r--r--modules/taxonomy/taxonomy.test25
-rw-r--r--modules/toolbar/toolbar.tpl.php2
-rw-r--r--modules/update/update.compare.inc5
-rw-r--r--modules/update/update.fetch.inc14
-rw-r--r--modules/update/update.test5
-rw-r--r--modules/user/user-picture.tpl.php2
-rw-r--r--modules/user/user-profile.tpl.php2
-rw-r--r--modules/user/user.api.php16
-rw-r--r--modules/user/user.install2
-rw-r--r--modules/user/user.module12
-rw-r--r--modules/user/user.test36
116 files changed, 2045 insertions, 724 deletions
diff --git a/modules/aggregator/aggregator.admin.inc b/modules/aggregator/aggregator.admin.inc
index 9f92a6705..8b817c0fa 100644
--- a/modules/aggregator/aggregator.admin.inc
+++ b/modules/aggregator/aggregator.admin.inc
@@ -77,7 +77,7 @@ function aggregator_form_feed($form, &$form_state, stdClass $feed = NULL) {
$form['url'] = array('#type' => 'textfield',
'#title' => t('URL'),
'#default_value' => isset($feed->url) ? $feed->url : '',
- '#maxlength' => 255,
+ '#maxlength' => NULL,
'#description' => t('The fully-qualified URL of the feed.'),
'#required' => TRUE,
);
diff --git a/modules/aggregator/aggregator.api.php b/modules/aggregator/aggregator.api.php
index 0f708eb85..cd5e47b14 100644
--- a/modules/aggregator/aggregator.api.php
+++ b/modules/aggregator/aggregator.api.php
@@ -19,8 +19,8 @@
* parser; and finally, it is passed to all active processors, which manipulate
* or store the data.
*
- * Modules that define this hook can be set as active fetcher on
- * admin/config/services/aggregator. Only one fetcher can be active at a time.
+ * Modules that define this hook can be set as the active fetcher within the
+ * configuration page. Only one fetcher can be active at a time.
*
* @param $feed
* A feed object representing the resource to be downloaded. $feed->url
@@ -43,10 +43,9 @@ function hook_aggregator_fetch($feed) {
/**
* Specify the title and short description of your fetcher.
*
- * The title and the description provided are shown on
- * admin/config/services/aggregator among other places. Use as title the human
- * readable name of the fetcher and as description a brief (40 to 80 characters)
- * explanation of the fetcher's functionality.
+ * The title and the description provided are shown within the configuration
+ * page. Use as title the human readable name of the fetcher and as description
+ * a brief (40 to 80 characters) explanation of the fetcher's functionality.
*
* This hook is only called if your module implements hook_aggregator_fetch().
* If this hook is not implemented aggregator will use your module's file name
@@ -75,8 +74,8 @@ function hook_aggregator_fetch_info() {
* active parser; and finally, it is passed to all active processors which
* manipulate or store the data.
*
- * Modules that define this hook can be set as the active parser on
- * admin/config/services/aggregator. Only one parser can be active at a time.
+ * Modules that define this hook can be set as the active parser within the
+ * configuration page. Only one parser can be active at a time.
*
* @param $feed
* An object describing the resource to be parsed. $feed->source_string
@@ -119,10 +118,9 @@ function hook_aggregator_parse($feed) {
/**
* Specify the title and short description of your parser.
*
- * The title and the description provided are shown on
- * admin/config/services/aggregator among other places. Use as title the human
- * readable name of the parser and as description a brief (40 to 80 characters)
- * explanation of the parser's functionality.
+ * The title and the description provided are shown within the configuration
+ * page. Use as title the human readable name of the parser and as description
+ * a brief (40 to 80 characters) explanation of the parser's functionality.
*
* This hook is only called if your module implements hook_aggregator_parse().
* If this hook is not implemented aggregator will use your module's file name
@@ -151,8 +149,8 @@ function hook_aggregator_parse_info() {
* parser; and finally, it is passed to all active processors that manipulate or
* store the data.
*
- * Modules that define this hook can be activated as processor on
- * admin/config/services/aggregator.
+ * Modules that define this hook can be activated as a processor within the
+ * configuration page.
*
* @param $feed
* A feed object representing the resource to be processed. $feed->items
@@ -176,10 +174,9 @@ function hook_aggregator_process($feed) {
/**
* Specify the title and short description of your processor.
*
- * The title and the description provided are shown most importantly on
- * admin/config/services/aggregator. Use as title the natural name of the
- * processor and as description a brief (40 to 80 characters) explanation of the
- * functionality.
+ * The title and the description provided are shown within the configuration
+ * page. Use as title the natural name of the processor and as description a
+ * brief (40 to 80 characters) explanation of the functionality.
*
* This hook is only called if your module implements hook_aggregator_process().
* If this hook is not implemented aggregator will use your module's file name
diff --git a/modules/aggregator/aggregator.install b/modules/aggregator/aggregator.install
index f19d7de9b..b84556a9d 100644
--- a/modules/aggregator/aggregator.install
+++ b/modules/aggregator/aggregator.install
@@ -130,10 +130,8 @@ function aggregator_schema() {
'description' => 'Title of the feed.',
),
'url' => array(
- 'type' => 'varchar',
- 'length' => 255,
+ 'type' => 'text',
'not null' => TRUE,
- 'default' => '',
'description' => 'URL to the feed.',
),
'refresh' => array(
@@ -155,10 +153,8 @@ function aggregator_schema() {
'description' => 'Time when this feed was queued for refresh, 0 if not queued.',
),
'link' => array(
- 'type' => 'varchar',
- 'length' => 255,
+ 'type' => 'text',
'not null' => TRUE,
- 'default' => '',
'description' => 'The parent website of the feed; comes from the <link> element in the feed.',
),
'description' => array(
@@ -202,13 +198,13 @@ function aggregator_schema() {
)
),
'primary key' => array('fid'),
- 'unique keys' => array(
- 'url' => array('url'),
- 'title' => array('title'),
- ),
'indexes' => array(
+ 'url' => array(array('url', 255)),
'queued' => array('queued'),
),
+ 'unique keys' => array(
+ 'title' => array('title'),
+ ),
);
$schema['aggregator_item'] = array(
@@ -233,10 +229,8 @@ function aggregator_schema() {
'description' => 'Title of the feed item.',
),
'link' => array(
- 'type' => 'varchar',
- 'length' => 255,
+ 'type' => 'text',
'not null' => TRUE,
- 'default' => '',
'description' => 'Link to the feed item.',
),
'author' => array(
@@ -258,9 +252,8 @@ function aggregator_schema() {
'description' => 'Posted date of the feed item, as a Unix timestamp.',
),
'guid' => array(
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => FALSE,
+ 'type' => 'text',
+ 'not null' => TRUE,
'description' => 'Unique identifier for the feed item.',
)
),
@@ -280,6 +273,11 @@ function aggregator_schema() {
}
/**
+ * @addtogroup updates-6.x-to-7.x
+ * @{
+ */
+
+/**
* Add hash column to aggregator_feed table.
*/
function aggregator_update_7000() {
@@ -306,3 +304,27 @@ function aggregator_update_7002() {
db_add_index('aggregator_feed', 'queued', array('queued'));
}
+/**
+ * @} End of "addtogroup updates-6.x-to-7.x"
+ */
+
+/**
+ * @addtogroup updates-7.x-extra
+ * @{
+ */
+
+/**
+ * Increase the length of {aggregator_feed}.url.
+ */
+function aggregator_update_7003() {
+ db_drop_unique_key('aggregator_feed', 'url');
+ db_change_field('aggregator_feed', 'url', 'url', array('type' => 'text', 'not null' => TRUE, 'description' => 'URL to the feed.'));
+ db_change_field('aggregator_feed', 'link', 'link', array('type' => 'text', 'not null' => TRUE, 'description' => 'The parent website of the feed; comes from the <link> element in the feed.'));
+ db_change_field('aggregator_item', 'link', 'link', array('type' => 'text', 'not null' => TRUE, 'description' => 'Link to the feed item.'));
+ db_change_field('aggregator_item', 'guid', 'guid', array('type' => 'text', 'not null' => TRUE, 'description' => 'Unique identifier for the feed item.'));
+ db_add_index('aggregator_feed', 'url', array(array('url', 255)));
+}
+
+/**
+ * @} End of "addtogroup updates-7.x-extra"
+ */
diff --git a/modules/aggregator/aggregator.module b/modules/aggregator/aggregator.module
index 686f4248a..93457c68d 100644
--- a/modules/aggregator/aggregator.module
+++ b/modules/aggregator/aggregator.module
@@ -534,6 +534,7 @@ function aggregator_save_feed($edit) {
'url' => $edit['url'],
'refresh' => $edit['refresh'],
'block' => $edit['block'],
+ 'link' => '',
'description' => '',
'image' => '',
))
@@ -568,15 +569,13 @@ function aggregator_remove($feed) {
// Call hook_aggregator_remove() on all modules.
module_invoke_all('aggregator_remove', $feed);
// Reset feed.
- db_merge('aggregator_feed')
- ->key(array('fid' => $feed->fid))
+ db_update('aggregator_feed')
+ ->condition('fid', $feed->fid)
->fields(array(
'checked' => 0,
'hash' => '',
'etag' => '',
'modified' => 0,
- 'description' => $feed->description,
- 'image' => $feed->image,
))
->execute();
}
diff --git a/modules/aggregator/aggregator.processor.inc b/modules/aggregator/aggregator.processor.inc
index 7fa86a9ad..3f1319c8c 100644
--- a/modules/aggregator/aggregator.processor.inc
+++ b/modules/aggregator/aggregator.processor.inc
@@ -38,8 +38,9 @@ function aggregator_aggregator_process($feed) {
$item['timestamp'] = isset($entry->timestamp) ? $entry->timestamp : REQUEST_TIME;
}
- // Make sure the item title fits in 255 varchar column.
+ // Make sure the item title and author fit in the 255 varchar column.
$item['title'] = truncate_utf8($item['title'], 255, TRUE, TRUE);
+ $item['author'] = truncate_utf8($item['author'], 255, TRUE, TRUE);
aggregator_save_item(array('iid' => (isset($entry->iid) ? $entry->iid : ''), 'fid' => $feed->fid, 'timestamp' => $item['timestamp'], 'title' => $item['title'], 'link' => $item['link'], 'author' => $item['author'], 'description' => $item['description'], 'guid' => $item['guid']));
}
}
diff --git a/modules/aggregator/aggregator.test b/modules/aggregator/aggregator.test
index 77b60cb93..eff31020f 100644
--- a/modules/aggregator/aggregator.test
+++ b/modules/aggregator/aggregator.test
@@ -25,10 +25,10 @@ class AggregatorTestCase extends DrupalWebTestCase {
function createFeed($feed_url = NULL) {
$edit = $this->getFeedEditArray($feed_url);
$this->drupalPost('admin/config/services/aggregator/add/feed', $edit, t('Save'));
- $this->assertRaw(t('The feed %name has been added.', array('%name' => $edit['title'])), t('The feed !name has been added.', array('!name' => $edit['title'])));
+ $this->assertRaw(t('The feed %name has been added.', array('%name' => $edit['title'])), format_string('The feed !name has been added.', array('!name' => $edit['title'])));
$feed = db_query("SELECT * FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $edit['title'], ':url' => $edit['url']))->fetch();
- $this->assertTrue(!empty($feed), t('The feed found in database.'));
+ $this->assertTrue(!empty($feed), 'The feed found in database.');
return $feed;
}
@@ -40,7 +40,7 @@ class AggregatorTestCase extends DrupalWebTestCase {
*/
function deleteFeed($feed) {
$this->drupalPost('admin/config/services/aggregator/edit/feed/' . $feed->fid, array(), t('Delete'));
- $this->assertRaw(t('The feed %title has been deleted.', array('%title' => $feed->title)), t('Feed deleted successfully.'));
+ $this->assertRaw(t('The feed %title has been deleted.', array('%title' => $feed->title)), 'Feed deleted successfully.');
}
/**
@@ -90,7 +90,7 @@ class AggregatorTestCase extends DrupalWebTestCase {
function updateFeedItems(&$feed, $expected_count) {
// First, let's ensure we can get to the rss xml.
$this->drupalGet($feed->url);
- $this->assertResponse(200, t('!url is reachable.', array('!url' => $feed->url)));
+ $this->assertResponse(200, format_string('!url is reachable.', array('!url' => $feed->url)));
// Attempt to access the update link directly without an access token.
$this->drupalGet('admin/config/services/aggregator/update/' . $feed->fid);
@@ -108,7 +108,7 @@ class AggregatorTestCase extends DrupalWebTestCase {
$feed->items[] = $item->iid;
}
$feed->item_count = count($feed->items);
- $this->assertEqual($expected_count, $feed->item_count, t('Total items in feed equal to the total items in database (!val1 != !val2)', array('!val1' => $expected_count, '!val2' => $feed->item_count)));
+ $this->assertEqual($expected_count, $feed->item_count, format_string('Total items in feed equal to the total items in database (!val1 != !val2)', array('!val1' => $expected_count, '!val2' => $feed->item_count)));
}
/**
@@ -119,7 +119,7 @@ class AggregatorTestCase extends DrupalWebTestCase {
*/
function removeFeedItems($feed) {
$this->drupalPost('admin/config/services/aggregator/remove/' . $feed->fid, array(), t('Remove items'));
- $this->assertRaw(t('The news items from %title have been removed.', array('%title' => $feed->title)), t('Feed items removed.'));
+ $this->assertRaw(t('The news items from %title have been removed.', array('%title' => $feed->title)), 'Feed items removed.');
}
/**
@@ -167,12 +167,12 @@ class AggregatorTestCase extends DrupalWebTestCase {
/**
- * Check if the feed name and url is unique.
+ * Check if the feed name and URL is unique.
*
* @param $feed_name
* String containing the feed name to check.
* @param $feed_url
- * String containing the feed url to check.
+ * String containing the feed URL to check.
* @return
* TRUE if feed is unique.
*/
@@ -316,7 +316,7 @@ class AggregatorConfigurationTestCase extends AggregatorTestCase {
$this->assertText(t('The configuration options have been saved.'));
foreach ($edit as $name => $value) {
- $this->assertFieldByName($name, $value, t('"@name" has correct default value.', array('@name' => $name)));
+ $this->assertFieldByName($name, $value, format_string('"@name" has correct default value.', array('@name' => $name)));
}
}
}
@@ -337,19 +337,48 @@ class AddFeedTestCase extends AggregatorTestCase {
$feed = $this->createFeed();
// Check feed data.
- $this->assertEqual($this->getUrl(), url('admin/config/services/aggregator/add/feed', array('absolute' => TRUE)), t('Directed to correct url.'));
- $this->assertTrue($this->uniqueFeed($feed->title, $feed->url), t('The feed is unique.'));
+ $this->assertEqual($this->getUrl(), url('admin/config/services/aggregator/add/feed', array('absolute' => TRUE)), 'Directed to correct url.');
+ $this->assertTrue($this->uniqueFeed($feed->title, $feed->url), 'The feed is unique.');
// Check feed source.
$this->drupalGet('aggregator/sources/' . $feed->fid);
- $this->assertResponse(200, t('Feed source exists.'));
- $this->assertText($feed->title, t('Page title'));
+ $this->assertResponse(200, 'Feed source exists.');
+ $this->assertText($feed->title, 'Page title');
$this->drupalGet('aggregator/sources/' . $feed->fid . '/categorize');
- $this->assertResponse(200, t('Feed categorization page exists.'));
+ $this->assertResponse(200, 'Feed categorization page exists.');
// Delete feed.
$this->deleteFeed($feed);
}
+
+ /**
+ * Tests feeds with very long URLs.
+ */
+ function testAddLongFeed() {
+ // Create a feed with a URL of > 255 characters.
+ $long_url = "https://www.google.com/search?ix=heb&sourceid=chrome&ie=UTF-8&q=angie+byron#sclient=psy-ab&hl=en&safe=off&source=hp&q=angie+byron&pbx=1&oq=angie+byron&aq=f&aqi=&aql=&gs_sm=3&gs_upl=0l0l0l10534l0l0l0l0l0l0l0l0ll0l0&bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&fp=a70b6b1f0abe28d8&biw=1629&bih=889&ix=heb";
+ $feed = $this->createFeed($long_url);
+
+ // Create a second feed of > 255 characters, where the only difference is
+ // after the 255th character.
+ $long_url_2 = "https://www.google.com/search?ix=heb&sourceid=chrome&ie=UTF-8&q=angie+byron#sclient=psy-ab&hl=en&safe=off&source=hp&q=angie+byron&pbx=1&oq=angie+byron&aq=f&aqi=&aql=&gs_sm=3&gs_upl=0l0l0l10534l0l0l0l0l0l0l0l0ll0l0&bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&fp=a70b6b1f0abe28d8&biw=1629&bih=889";
+ $feed_2 = $this->createFeed($long_url_2);
+
+ // Check feed data.
+ $this->assertTrue($this->uniqueFeed($feed->title, $feed->url), 'The first long URL feed is unique.');
+ $this->assertTrue($this->uniqueFeed($feed_2->title, $feed_2->url), 'The second long URL feed is unique.');
+
+ // Check feed source.
+ $this->drupalGet('aggregator/sources/' . $feed->fid);
+ $this->assertResponse(200, 'Long URL feed source exists.');
+ $this->assertText($feed->title, 'Page title');
+ $this->drupalGet('aggregator/sources/' . $feed->fid . '/categorize');
+ $this->assertResponse(200, 'Long URL feed categorization page exists.');
+
+ // Delete feeds.
+ $this->deleteFeed($feed);
+ $this->deleteFeed($feed_2);
+ }
}
class CategorizeFeedTestCase extends AggregatorTestCase {
@@ -369,11 +398,11 @@ class CategorizeFeedTestCase extends AggregatorTestCase {
// Create 2 categories.
$category_1 = array('title' => $this->randomName(10), 'description' => '');
$this->drupalPost('admin/config/services/aggregator/add/category', $category_1, t('Save'));
- $this->assertRaw(t('The category %title has been added.', array('%title' => $category_1['title'])), t('The category %title has been added.', array('%title' => $category_1['title'])));
+ $this->assertRaw(t('The category %title has been added.', array('%title' => $category_1['title'])), format_string('The category %title has been added.', array('%title' => $category_1['title'])));
$category_2 = array('title' => $this->randomName(10), 'description' => '');
$this->drupalPost('admin/config/services/aggregator/add/category', $category_2, t('Save'));
- $this->assertRaw(t('The category %title has been added.', array('%title' => $category_2['title'])), t('The category %title has been added.', array('%title' => $category_2['title'])));
+ $this->assertRaw(t('The category %title has been added.', array('%title' => $category_2['title'])), format_string('The category %title has been added.', array('%title' => $category_2['title'])));
// Get categories from database.
$categories = $this->getCategories();
@@ -391,7 +420,7 @@ class CategorizeFeedTestCase extends AggregatorTestCase {
// Assert the feed has two categories.
$this->getFeedCategories($db_feed);
- $this->assertEqual(count($db_feed->categories), 2, t('Feed has 2 categories'));
+ $this->assertEqual(count($db_feed->categories), 2, 'Feed has 2 categories');
}
}
@@ -419,16 +448,16 @@ class UpdateFeedTestCase extends AggregatorTestCase {
$edit[$same_field] = $feed->{$same_field};
}
$this->drupalPost('admin/config/services/aggregator/edit/feed/' . $feed->fid, $edit, t('Save'));
- $this->assertRaw(t('The feed %name has been updated.', array('%name' => $edit['title'])), t('The feed %name has been updated.', array('%name' => $edit['title'])));
+ $this->assertRaw(t('The feed %name has been updated.', array('%name' => $edit['title'])), format_string('The feed %name has been updated.', array('%name' => $edit['title'])));
// Check feed data.
$this->assertEqual($this->getUrl(), url('admin/config/services/aggregator/', array('absolute' => TRUE)));
- $this->assertTrue($this->uniqueFeed($edit['title'], $edit['url']), t('The feed is unique.'));
+ $this->assertTrue($this->uniqueFeed($edit['title'], $edit['url']), 'The feed is unique.');
// Check feed source.
$this->drupalGet('aggregator/sources/' . $feed->fid);
- $this->assertResponse(200, t('Feed source exists.'));
- $this->assertText($edit['title'], t('Page title'));
+ $this->assertResponse(200, 'Feed source exists.');
+ $this->assertText($edit['title'], 'Page title');
// Delete feed.
$feed->title = $edit['title']; // Set correct title so deleteFeed() will work.
@@ -457,11 +486,11 @@ class RemoveFeedTestCase extends AggregatorTestCase {
// Check feed source.
$this->drupalGet('aggregator/sources/' . $feed->fid);
- $this->assertResponse(404, t('Deleted feed source does not exists.'));
+ $this->assertResponse(404, 'Deleted feed source does not exists.');
// Check database for feed.
$result = db_query("SELECT COUNT(*) FROM {aggregator_feed} WHERE title = :title AND url = :url", array(':title' => $feed->title, ':url' => $feed->url))->fetchField();
- $this->assertFalse($result, t('Feed not found in database'));
+ $this->assertFalse($result, 'Feed not found in database');
}
}
@@ -497,10 +526,10 @@ class UpdateFeedItemTestCase extends AggregatorTestCase {
);
$this->drupalGet($edit['url']);
- $this->assertResponse(array(200), t('URL !url is accessible', array('!url' => $edit['url'])));
+ $this->assertResponse(array(200), format_string('URL !url is accessible', array('!url' => $edit['url'])));
$this->drupalPost('admin/config/services/aggregator/add/feed', $edit, t('Save'));
- $this->assertRaw(t('The feed %name has been added.', array('%name' => $edit['title'])), t('The feed !name has been added.', array('!name' => $edit['title'])));
+ $this->assertRaw(t('The feed %name has been added.', array('%name' => $edit['title'])), format_string('The feed !name has been added.', array('!name' => $edit['title'])));
$feed = db_query("SELECT * FROM {aggregator_feed} WHERE url = :url", array(':url' => $edit['url']))->fetchObject();
@@ -521,7 +550,7 @@ class UpdateFeedItemTestCase extends AggregatorTestCase {
aggregator_refresh($feed);
$after = db_query('SELECT timestamp FROM {aggregator_item} WHERE fid = :fid', array(':fid' => $feed->fid))->fetchField();
- $this->assertTrue($before === $after, t('Publish timestamp of feed item was not updated (!before === !after)', array('!before' => $before, '!after' => $after)));
+ $this->assertTrue($before === $after, format_string('Publish timestamp of feed item was not updated (!before === !after)', array('!before' => $before, '!after' => $after)));
}
}
@@ -554,9 +583,9 @@ class RemoveFeedItemTestCase extends AggregatorTestCase {
// Update and remove items two times in a row to make sure that removal
// resets all 'modified' information (modified, etag, hash) and allows for
// immediate update.
- $this->updateAndRemove($feed, 2);
- $this->updateAndRemove($feed, 2);
- $this->updateAndRemove($feed, 2);
+ $this->updateAndRemove($feed, 4);
+ $this->updateAndRemove($feed, 4);
+ $this->updateAndRemove($feed, 4);
// Delete feed.
$this->deleteFeed($feed);
}
@@ -582,14 +611,14 @@ class CategorizeFeedItemTestCase extends AggregatorTestCase {
// Simulate form submission on "admin/config/services/aggregator/add/category".
$edit = array('title' => $this->randomName(10), 'description' => '');
$this->drupalPost('admin/config/services/aggregator/add/category', $edit, t('Save'));
- $this->assertRaw(t('The category %title has been added.', array('%title' => $edit['title'])), t('The category %title has been added.', array('%title' => $edit['title'])));
+ $this->assertRaw(t('The category %title has been added.', array('%title' => $edit['title'])), format_string('The category %title has been added.', array('%title' => $edit['title'])));
$category = db_query("SELECT * FROM {aggregator_category} WHERE title = :title", array(':title' => $edit['title']))->fetch();
- $this->assertTrue(!empty($category), t('The category found in database.'));
+ $this->assertTrue(!empty($category), 'The category found in database.');
$link_path = 'aggregator/categories/' . $category->cid;
$menu_link = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => $link_path))->fetch();
- $this->assertTrue(!empty($menu_link), t('The menu link associated with the category found in database.'));
+ $this->assertTrue(!empty($menu_link), 'The menu link associated with the category found in database.');
$feed = $this->createFeed();
db_insert('aggregator_category_feed')
@@ -600,7 +629,7 @@ class CategorizeFeedItemTestCase extends AggregatorTestCase {
->execute();
$this->updateFeedItems($feed, $this->getDefaultFeedItemCount());
$this->getFeedCategories($feed);
- $this->assertTrue(!empty($feed->categories), t('The category found in the feed.'));
+ $this->assertTrue(!empty($feed->categories), 'The category found in the feed.');
// For each category of a feed, ensure feed items have that category, too.
if (!empty($feed->categories) && !empty($feed->items)) {
@@ -611,7 +640,7 @@ class CategorizeFeedItemTestCase extends AggregatorTestCase {
->execute()
->fetchField();
- $this->assertEqual($feed->item_count, $categorized_count, t('Total items in feed equal to the total categorized feed items in database'));
+ $this->assertEqual($feed->item_count, $categorized_count, 'Total items in feed equal to the total categorized feed items in database');
}
}
@@ -644,11 +673,11 @@ class ImportOPMLTestCase extends AggregatorTestCase {
->execute();
$this->drupalGet('admin/config/services/aggregator/add/opml');
- $this->assertText('A single OPML document may contain a collection of many feeds.', t('Found OPML help text.'));
- $this->assertField('files[upload]', t('Found file upload field.'));
- $this->assertField('remote', t('Found Remote URL field.'));
- $this->assertField('refresh', '', t('Found Refresh field.'));
- $this->assertFieldByName("category[$cid]", $cid, t('Found category field.'));
+ $this->assertText('A single OPML document may contain a collection of many feeds.', 'Found OPML help text.');
+ $this->assertField('files[upload]', 'Found file upload field.');
+ $this->assertField('remote', 'Found Remote URL field.');
+ $this->assertField('refresh', 'Found Refresh field.');
+ $this->assertFieldByName("category[$cid]", $cid, 'Found category field.');
}
/**
@@ -659,7 +688,7 @@ class ImportOPMLTestCase extends AggregatorTestCase {
$edit = array();
$this->drupalPost('admin/config/services/aggregator/add/opml', $edit, t('Import'));
- $this->assertRaw(t('You must <em>either</em> upload a file or enter a URL.'), t('Error if no fields are filled.'));
+ $this->assertRaw(t('You must <em>either</em> upload a file or enter a URL.'), 'Error if no fields are filled.');
$path = $this->getEmptyOpml();
$edit = array(
@@ -667,14 +696,14 @@ class ImportOPMLTestCase extends AggregatorTestCase {
'remote' => file_create_url($path),
);
$this->drupalPost('admin/config/services/aggregator/add/opml', $edit, t('Import'));
- $this->assertRaw(t('You must <em>either</em> upload a file or enter a URL.'), t('Error if both fields are filled.'));
+ $this->assertRaw(t('You must <em>either</em> upload a file or enter a URL.'), 'Error if both fields are filled.');
$edit = array('remote' => 'invalidUrl://empty');
$this->drupalPost('admin/config/services/aggregator/add/opml', $edit, t('Import'));
- $this->assertText(t('This URL is not valid.'), t('Error if the URL is invalid.'));
+ $this->assertText(t('This URL is not valid.'), 'Error if the URL is invalid.');
$after = db_query('SELECT COUNT(*) FROM {aggregator_feed}')->fetchField();
- $this->assertEqual($before, $after, t('No feeds were added during the three last form submissions.'));
+ $this->assertEqual($before, $after, 'No feeds were added during the three last form submissions.');
}
/**
@@ -685,14 +714,14 @@ class ImportOPMLTestCase extends AggregatorTestCase {
$form['files[upload]'] = $this->getInvalidOpml();
$this->drupalPost('admin/config/services/aggregator/add/opml', $form, t('Import'));
- $this->assertText(t('No new feed has been added.'), t('Attempting to upload invalid XML.'));
+ $this->assertText(t('No new feed has been added.'), 'Attempting to upload invalid XML.');
$edit = array('remote' => file_create_url($this->getEmptyOpml()));
$this->drupalPost('admin/config/services/aggregator/add/opml', $edit, t('Import'));
- $this->assertText(t('No new feed has been added.'), t('Attempting to load empty OPML from remote URL.'));
+ $this->assertText(t('No new feed has been added.'), 'Attempting to load empty OPML from remote URL.');
$after = db_query('SELECT COUNT(*) FROM {aggregator_feed}')->fetchField();
- $this->assertEqual($before, $after, t('No feeds were added during the two last form submissions.'));
+ $this->assertEqual($before, $after, 'No feeds were added during the two last form submissions.');
db_delete('aggregator_feed')->execute();
db_delete('aggregator_category')->execute();
@@ -716,11 +745,11 @@ class ImportOPMLTestCase extends AggregatorTestCase {
'category[1]' => $category,
);
$this->drupalPost('admin/config/services/aggregator/add/opml', $edit, t('Import'));
- $this->assertRaw(t('A feed with the URL %url already exists.', array('%url' => $feeds[0]['url'])), t('Verifying that a duplicate URL was identified'));
- $this->assertRaw(t('A feed named %title already exists.', array('%title' => $feeds[1]['title'])), t('Verifying that a duplicate title was identified'));
+ $this->assertRaw(t('A feed with the URL %url already exists.', array('%url' => $feeds[0]['url'])), 'Verifying that a duplicate URL was identified');
+ $this->assertRaw(t('A feed named %title already exists.', array('%title' => $feeds[1]['title'])), 'Verifying that a duplicate title was identified');
$after = db_query('SELECT COUNT(*) FROM {aggregator_feed}')->fetchField();
- $this->assertEqual($after, 2, t('Verifying that two distinct feeds were added.'));
+ $this->assertEqual($after, 2, 'Verifying that two distinct feeds were added.');
$feeds_from_db = db_query("SELECT f.title, f.url, f.refresh, cf.cid FROM {aggregator_feed} f LEFT JOIN {aggregator_category_feed} cf ON f.fid = cf.fid");
$refresh = $category = TRUE;
@@ -731,10 +760,10 @@ class ImportOPMLTestCase extends AggregatorTestCase {
$refresh = $refresh && $feed->refresh == 900;
}
- $this->assertEqual($title[$feeds[0]['url']], $feeds[0]['title'], t('First feed was added correctly.'));
- $this->assertEqual($url[$feeds[1]['title']], $feeds[1]['url'], t('Second feed was added correctly.'));
- $this->assertTrue($refresh, t('Refresh times are correct.'));
- $this->assertTrue($category, t('Categories are correct.'));
+ $this->assertEqual($title[$feeds[0]['url']], $feeds[0]['title'], 'First feed was added correctly.');
+ $this->assertEqual($url[$feeds[1]['title']], $feeds[1]['url'], 'Second feed was added correctly.');
+ $this->assertTrue($refresh, 'Refresh times are correct.');
+ $this->assertTrue($category, 'Categories are correct.');
}
function testOPMLImport() {
@@ -834,20 +863,20 @@ class AggregatorRenderingTestCase extends AggregatorTestCase {
$this->assertFieldByName('blocks[' . $block['module'] . '_' . $block['delta'] . '][region]', '', 'Aggregator feed block is available for positioning.');
// Position it.
$this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
- $this->assertText(t('The block settings have been updated.'), t('Block successfully moved to %region_name region.', array( '%region_name' => $region)));
+ $this->assertText(t('The block settings have been updated.'), format_string('Block successfully moved to %region_name region.', array( '%region_name' => $region)));
// Confirm that the block is now being displayed on pages.
$this->drupalGet('node');
- $this->assertText(t($block['title']), t('Feed block is displayed on the page.'));
+ $this->assertText(t($block['title']), 'Feed block is displayed on the page.');
// Find the expected read_more link.
$href = 'aggregator/sources/' . $feed->fid;
$links = $this->xpath('//a[@href = :href]', array(':href' => url($href)));
- $this->assert(isset($links[0]), t('Link to href %href found.', array('%href' => $href)));
+ $this->assert(isset($links[0]), format_string('Link to href %href found.', array('%href' => $href)));
// Visit that page.
$this->drupalGet($href);
$correct_titles = $this->xpath('//h1[normalize-space(text())=:title]', array(':title' => $feed->title));
- $this->assertFalse(empty($correct_titles), t('Aggregator feed page is available and has the correct title.'));
+ $this->assertFalse(empty($correct_titles), 'Aggregator feed page is available and has the correct title.');
// Set the number of news items to 0 to test that the block does not show
// up.
@@ -876,7 +905,7 @@ class AggregatorRenderingTestCase extends AggregatorTestCase {
// Check for the presence of a pager.
$this->drupalGet('aggregator/sources/' . $feed->fid);
$elements = $this->xpath("//ul[@class=:class]", array(':class' => 'pager'));
- $this->assertTrue(!empty($elements), t('Individual source page contains a pager.'));
+ $this->assertTrue(!empty($elements), 'Individual source page contains a pager.');
// Reset the number of items in rss.xml to the default value.
variable_set('feed_default_items', 10);
@@ -910,10 +939,19 @@ class FeedParserTestCase extends AggregatorTestCase {
$feed = $this->createFeed($this->getRSS091Sample());
aggregator_refresh($feed);
$this->drupalGet('aggregator/sources/' . $feed->fid);
- $this->assertResponse(200, t('Feed %name exists.', array('%name' => $feed->title)));
+ $this->assertResponse(200, format_string('Feed %name exists.', array('%name' => $feed->title)));
$this->assertText('First example feed item title');
$this->assertLinkByHref('http://example.com/example-turns-one');
$this->assertText('First example feed item description.');
+
+ // Several additional items that include elements over 255 characters.
+ $this->assertRaw("Second example feed item title.");
+ $this->assertText('Long link feed item title');
+ $this->assertText('Long link feed item description');
+ $this->assertLinkByHref('http://example.com/tomorrow/and/tomorrow/and/tomorrow/creeps/in/this/petty/pace/from/day/to/day/to/the/last/syllable/of/recorded/time/and/all/our/yesterdays/have/lighted/fools/the/way/to/dusty/death/out/out/brief/candle/life/is/but/a/walking/shadow/a/poor/player/that/struts/and/frets/his/hour/upon/the/stage/and/is/heard/no/more/it/is/a/tale/told/by/an/idiot/full/of/sound/and/fury/signifying/nothing');
+ $this->assertText('Long author feed item title');
+ $this->assertText('Long author feed item description');
+ $this->assertLinkByHref('http://example.com/long/author');
}
/**
@@ -923,7 +961,7 @@ class FeedParserTestCase extends AggregatorTestCase {
$feed = $this->createFeed($this->getAtomSample());
aggregator_refresh($feed);
$this->drupalGet('aggregator/sources/' . $feed->fid);
- $this->assertResponse(200, t('Feed %name exists.', array('%name' => $feed->title)));
+ $this->assertResponse(200, format_string('Feed %name exists.', array('%name' => $feed->title)));
$this->assertText('Atom-Powered Robots Run Amok');
$this->assertLinkByHref('http://example.org/2003/12/13/atom03');
$this->assertText('Some text.');
diff --git a/modules/aggregator/tests/aggregator_test_rss091.xml b/modules/aggregator/tests/aggregator_test_rss091.xml
index f39a2732c..29440227f 100644
--- a/modules/aggregator/tests/aggregator_test_rss091.xml
+++ b/modules/aggregator/tests/aggregator_test_rss091.xml
@@ -26,5 +26,16 @@
<link>http://example.com/example-turns-two</link>
<description>Second example feed item description.</description>
</item>
+ <item>
+ <title>Long link feed item title.</title>
+ <link>http://example.com/tomorrow/and/tomorrow/and/tomorrow/creeps/in/this/petty/pace/from/day/to/day/to/the/last/syllable/of/recorded/time/and/all/our/yesterdays/have/lighted/fools/the/way/to/dusty/death/out/out/brief/candle/life/is/but/a/walking/shadow/a/poor/player/that/struts/and/frets/his/hour/upon/the/stage/and/is/heard/no/more/it/is/a/tale/told/by/an/idiot/full/of/sound/and/fury/signifying/nothing</link>
+ <description>Long link feed item description.</description>
+ </item>
+ <item>
+ <title>Long author feed item title.</title>
+ <link>http://example.com/long/author</link>
+ <author>I wanted to get out and walk eastward toward the park through the soft twilight, but each time I tried to go I became entangled in some wild, strident argument which pulled me back, as if with ropes, into my chair. Yet high over the city our line of yellow windows must have contributed their share of human secrecy to the casual watcher in the darkening streets, and I was him too, looking up and wondering. I was within and without, simultaneously enchanted and repelled by the inexhaustible variety of life.</author>
+ <description>Long author feed item description.</description>
+ </item>
</channel>
</rss>
diff --git a/modules/block/block.api.php b/modules/block/block.api.php
index 3cd52f8b7..312eb11f2 100644
--- a/modules/block/block.api.php
+++ b/modules/block/block.api.php
@@ -55,6 +55,7 @@
* viewed.
* - DRUPAL_CACHE_GLOBAL: The block is the same for every user on every page
* where it is visible.
+ * - DRUPAL_CACHE_CUSTOM: The module implements its own caching system.
* - DRUPAL_NO_CACHE: The block should not get cached.
* - properties: (optional) Array of additional metadata to add to the block.
* Common properties include:
diff --git a/modules/book/book.admin.inc b/modules/book/book.admin.inc
index 2f60610c8..62c6e841a 100644
--- a/modules/book/book.admin.inc
+++ b/modules/book/book.admin.inc
@@ -278,5 +278,5 @@ function theme_book_admin_table($variables) {
$rows[] = $row;
}
- return theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'book-outline')));
+ return theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'book-outline'), 'empty' => t('No book content available.')));
}
diff --git a/modules/book/book.js b/modules/book/book.js
index 075f33b93..0853e8ecb 100644
--- a/modules/book/book.js
+++ b/modules/book/book.js
@@ -1,3 +1,9 @@
+/**
+ * @file
+ * Javascript behaviors for the Book module.
+ */
+
+
(function ($) {
Drupal.behaviors.bookFieldsetSummaries = {
diff --git a/modules/comment/comment-wrapper.tpl.php b/modules/comment/comment-wrapper.tpl.php
index 3293e88ae..c69145929 100644
--- a/modules/comment/comment-wrapper.tpl.php
+++ b/modules/comment/comment-wrapper.tpl.php
@@ -32,7 +32,8 @@
* into a string within the variable $classes.
*
* @see template_preprocess_comment_wrapper()
- * @see theme_comment_wrapper()
+ *
+ * @ingroup themeable
*/
?>
<div id="comments" class="<?php print $classes; ?>"<?php print $attributes; ?>>
diff --git a/modules/comment/comment.module b/modules/comment/comment.module
index 429c3b01b..05bc7aa2b 100644
--- a/modules/comment/comment.module
+++ b/modules/comment/comment.module
@@ -152,7 +152,7 @@ function comment_node_type_load($name) {
}
/**
- * Entity uri callback.
+ * Entity URI callback.
*/
function comment_uri($comment) {
return array(
@@ -992,6 +992,14 @@ function comment_build_content($comment, $node, $view_mode = 'full', $langcode =
// Remove previously built content, if exists.
$comment->content = array();
+ // Allow modules to change the view mode.
+ $context = array(
+ 'entity_type' => 'comment',
+ 'entity' => $comment,
+ 'langcode' => $langcode,
+ );
+ drupal_alter('entity_view_mode', $view_mode, $context);
+
// Build fields content.
field_attach_prepare_view('comment', array($comment->cid => $comment), $view_mode, $langcode);
entity_prepare_view('comment', array($comment->cid => $comment), $langcode);
@@ -2375,7 +2383,6 @@ function theme_comment_post_forbidden($variables) {
* Process variables for comment-wrapper.tpl.php.
*
* @see comment-wrapper.tpl.php
- * @see theme_comment_wrapper()
*/
function template_preprocess_comment_wrapper(&$variables) {
// Provide contextual information.
diff --git a/modules/comment/comment.test b/modules/comment/comment.test
index e787d25d1..30bff7140 100644
--- a/modules/comment/comment.test
+++ b/modules/comment/comment.test
@@ -1,7 +1,7 @@
<?php
/**
- * @file
+ * @file
* Tests for comment.module.
*/
@@ -48,7 +48,7 @@ class CommentHelperCase extends DrupalWebTestCase {
$edit['subject'] = $subject;
}
else {
- $this->assertNoFieldByName('subject', '', t('Subject field not found.'));
+ $this->assertNoFieldByName('subject', '', 'Subject field not found.');
}
if ($contact !== NULL && is_array($contact)) {
@@ -57,19 +57,19 @@ class CommentHelperCase extends DrupalWebTestCase {
switch ($preview_mode) {
case DRUPAL_REQUIRED:
// Preview required so no save button should be found.
- $this->assertNoFieldByName('op', t('Save'), t('Save button not found.'));
+ $this->assertNoFieldByName('op', t('Save'), 'Save button not found.');
$this->drupalPost(NULL, $edit, t('Preview'));
// Don't break here so that we can test post-preview field presence and
// function below.
case DRUPAL_OPTIONAL:
- $this->assertFieldByName('op', t('Preview'), t('Preview button found.'));
- $this->assertFieldByName('op', t('Save'), t('Save button found.'));
+ $this->assertFieldByName('op', t('Preview'), 'Preview button found.');
+ $this->assertFieldByName('op', t('Save'), 'Save button found.');
$this->drupalPost(NULL, $edit, t('Save'));
break;
case DRUPAL_DISABLED:
- $this->assertNoFieldByName('op', t('Preview'), t('Preview button not found.'));
- $this->assertFieldByName('op', t('Save'), t('Save button found.'));
+ $this->assertNoFieldByName('op', t('Preview'), 'Preview button not found.');
+ $this->assertFieldByName('op', t('Save'), 'Save button found.');
$this->drupalPost(NULL, $edit, t('Save'));
break;
}
@@ -83,7 +83,7 @@ class CommentHelperCase extends DrupalWebTestCase {
$this->assertText($subject, 'Comment subject posted.');
}
$this->assertText($comment, 'Comment body posted.');
- $this->assertTrue((!empty($match) && !empty($match[1])), t('Comment id found.'));
+ $this->assertTrue((!empty($match) && !empty($match[1])), 'Comment id found.');
}
if (isset($match[1])) {
@@ -122,7 +122,7 @@ class CommentHelperCase extends DrupalWebTestCase {
*/
function deleteComment($comment) {
$this->drupalPost('comment/' . $comment->id . '/delete', array(), t('Delete'));
- $this->assertText(t('The comment and all its replies have been deleted.'), t('Comment deleted.'));
+ $this->assertText(t('The comment and all its replies have been deleted.'), 'Comment deleted.');
}
/**
@@ -200,7 +200,8 @@ class CommentHelperCase extends DrupalWebTestCase {
*/
function setCommentSettings($name, $value, $message) {
variable_set($name . '_article', $value);
- $this->assertTrue(TRUE, t($message)); // Display status message.
+ // Display status message.
+ $this->assertTrue(TRUE, $message);
}
/**
@@ -230,10 +231,10 @@ class CommentHelperCase extends DrupalWebTestCase {
if ($operation == 'delete') {
$this->drupalPost(NULL, array(), t('Delete comments'));
- $this->assertRaw(format_plural(1, 'Deleted 1 comment.', 'Deleted @count comments.'), t('Operation "' . $operation . '" was performed on comment.'));
+ $this->assertRaw(format_plural(1, 'Deleted 1 comment.', 'Deleted @count comments.'), format_string('Operation @operation was performed on comment.', array('@operation' => $operation)));
}
else {
- $this->assertText(t('The update has been performed.'), t('Operation "' . $operation . '" was performed on comment.'));
+ $this->assertText(t('The update has been performed.'), format_string('Operation @operation was performed on comment.', array('@operation' => $operation)));
}
}
@@ -280,7 +281,7 @@ class CommentInterfaceTest extends CommentHelperCase {
$comment_text = $this->randomName();
$comment = $this->postComment($this->node, $comment_text);
$comment_loaded = comment_load($comment->id);
- $this->assertTrue($this->commentExists($comment), t('Comment found.'));
+ $this->assertTrue($this->commentExists($comment), 'Comment found.');
// Set comments to have subject and preview to required.
$this->drupalLogout();
@@ -295,12 +296,12 @@ class CommentInterfaceTest extends CommentHelperCase {
$comment_text = $this->randomName();
$comment = $this->postComment($this->node, $comment_text, $subject_text, TRUE);
$comment_loaded = comment_load($comment->id);
- $this->assertTrue($this->commentExists($comment), t('Comment found.'));
+ $this->assertTrue($this->commentExists($comment), 'Comment found.');
// Check comment display.
$this->drupalGet('node/' . $this->node->nid . '/' . $comment->id);
- $this->assertText($subject_text, t('Individual comment subject found.'));
- $this->assertText($comment_text, t('Individual comment body found.'));
+ $this->assertText($subject_text, 'Individual comment subject found.');
+ $this->assertText($comment_text, 'Individual comment body found.');
// Set comments to have subject and preview to optional.
$this->drupalLogout();
@@ -312,20 +313,20 @@ class CommentInterfaceTest extends CommentHelperCase {
$this->drupalGet('comment/' . $comment->id . '/edit');
$comment = $this->postComment(NULL, $comment->comment, $comment->subject, array('name' => ''));
$comment_loaded = comment_load($comment->id);
- $this->assertTrue(empty($comment_loaded->name) && $comment_loaded->uid == 0, t('Comment author successfully changed to anonymous.'));
+ $this->assertTrue(empty($comment_loaded->name) && $comment_loaded->uid == 0, 'Comment author successfully changed to anonymous.');
// Test changing the comment author to an unverified user.
$random_name = $this->randomName();
$this->drupalGet('comment/' . $comment->id . '/edit');
$comment = $this->postComment(NULL, $comment->comment, $comment->subject, array('name' => $random_name));
$this->drupalGet('node/' . $this->node->nid);
- $this->assertText($random_name . ' (' . t('not verified') . ')', t('Comment author successfully changed to an unverified user.'));
+ $this->assertText($random_name . ' (' . t('not verified') . ')', 'Comment author successfully changed to an unverified user.');
// Test changing the comment author to a verified user.
$this->drupalGet('comment/' . $comment->id . '/edit');
$comment = $this->postComment(NULL, $comment->comment, $comment->subject, array('name' => $this->web_user->name));
$comment_loaded = comment_load($comment->id);
- $this->assertTrue($comment_loaded->name == $this->web_user->name && $comment_loaded->uid == $this->web_user->uid, t('Comment author successfully changed to a registered user.'));
+ $this->assertTrue($comment_loaded->name == $this->web_user->name && $comment_loaded->uid == $this->web_user->uid, 'Comment author successfully changed to a registered user.');
$this->drupalLogout();
@@ -333,60 +334,60 @@ class CommentInterfaceTest extends CommentHelperCase {
// subject though field enabled.
$this->drupalLogin($this->web_user);
$this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id);
- $this->assertText($subject_text, t('Individual comment-reply subject found.'));
- $this->assertText($comment_text, t('Individual comment-reply body found.'));
+ $this->assertText($subject_text, 'Individual comment-reply subject found.');
+ $this->assertText($comment_text, 'Individual comment-reply body found.');
$reply = $this->postComment(NULL, $this->randomName(), '', TRUE);
$reply_loaded = comment_load($reply->id);
- $this->assertTrue($this->commentExists($reply, TRUE), t('Reply found.'));
- $this->assertEqual($comment->id, $reply_loaded->pid, t('Pid of a reply to a comment is set correctly.'));
- $this->assertEqual(rtrim($comment_loaded->thread, '/') . '.00/', $reply_loaded->thread, t('Thread of reply grows correctly.'));
+ $this->assertTrue($this->commentExists($reply, TRUE), 'Reply found.');
+ $this->assertEqual($comment->id, $reply_loaded->pid, 'Pid of a reply to a comment is set correctly.');
+ $this->assertEqual(rtrim($comment_loaded->thread, '/') . '.00/', $reply_loaded->thread, 'Thread of reply grows correctly.');
// Second reply to comment #3 creating comment #4.
$this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id);
- $this->assertText($subject_text, t('Individual comment-reply subject found.'));
- $this->assertText($comment_text, t('Individual comment-reply body found.'));
+ $this->assertText($subject_text, 'Individual comment-reply subject found.');
+ $this->assertText($comment_text, 'Individual comment-reply body found.');
$reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
$reply_loaded = comment_load($reply->id);
- $this->assertTrue($this->commentExists($reply, TRUE), t('Second reply found.'));
- $this->assertEqual(rtrim($comment_loaded->thread, '/') . '.01/', $reply_loaded->thread, t('Thread of second reply grows correctly.'));
+ $this->assertTrue($this->commentExists($reply, TRUE), 'Second reply found.');
+ $this->assertEqual(rtrim($comment_loaded->thread, '/') . '.01/', $reply_loaded->thread, 'Thread of second reply grows correctly.');
// Edit reply.
$this->drupalGet('comment/' . $reply->id . '/edit');
$reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
- $this->assertTrue($this->commentExists($reply, TRUE), t('Modified reply found.'));
+ $this->assertTrue($this->commentExists($reply, TRUE), 'Modified reply found.');
// Correct link count
$this->drupalGet('node');
- $this->assertRaw('4 comments', t('Link to the 4 comments exist.'));
+ $this->assertRaw('4 comments', 'Link to the 4 comments exist.');
// Confirm a new comment is posted to the correct page.
$this->setCommentsPerPage(2);
$comment_new_page = $this->postComment($this->node, $this->randomName(), $this->randomName(), TRUE);
- $this->assertTrue($this->commentExists($comment_new_page), t('Page one exists. %s'));
+ $this->assertTrue($this->commentExists($comment_new_page), 'Page one exists. %s');
$this->drupalGet('node/' . $this->node->nid, array('query' => array('page' => 1)));
- $this->assertTrue($this->commentExists($reply, TRUE), t('Page two exists. %s'));
+ $this->assertTrue($this->commentExists($reply, TRUE), 'Page two exists. %s');
$this->setCommentsPerPage(50);
// Attempt to post to node with comments disabled.
$this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'comment' => COMMENT_NODE_HIDDEN));
- $this->assertTrue($this->node, t('Article node created.'));
+ $this->assertTrue($this->node, 'Article node created.');
$this->drupalGet('comment/reply/' . $this->node->nid);
- $this->assertText('This discussion is closed', t('Posting to node with comments disabled'));
- $this->assertNoField('edit-comment', t('Comment body field found.'));
+ $this->assertText('This discussion is closed', 'Posting to node with comments disabled');
+ $this->assertNoField('edit-comment', 'Comment body field found.');
// Attempt to post to node with read-only comments.
$this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'comment' => COMMENT_NODE_CLOSED));
- $this->assertTrue($this->node, t('Article node created.'));
+ $this->assertTrue($this->node, 'Article node created.');
$this->drupalGet('comment/reply/' . $this->node->nid);
- $this->assertText('This discussion is closed', t('Posting to node with comments read-only'));
- $this->assertNoField('edit-comment', t('Comment body field found.'));
+ $this->assertText('This discussion is closed', 'Posting to node with comments read-only');
+ $this->assertNoField('edit-comment', 'Comment body field found.');
// Attempt to post to node with comments enabled (check field names etc).
$this->node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1, 'comment' => COMMENT_NODE_OPEN));
- $this->assertTrue($this->node, t('Article node created.'));
+ $this->assertTrue($this->node, 'Article node created.');
$this->drupalGet('comment/reply/' . $this->node->nid);
- $this->assertNoText('This discussion is closed', t('Posting to node with comments enabled'));
- $this->assertField('edit-comment-body-' . $langcode . '-0-value', t('Comment body field found.'));
+ $this->assertNoText('This discussion is closed', 'Posting to node with comments enabled');
+ $this->assertField('edit-comment-body-' . $langcode . '-0-value', 'Comment body field found.');
// Delete comment and make sure that reply is also removed.
$this->drupalLogout();
@@ -395,8 +396,8 @@ class CommentInterfaceTest extends CommentHelperCase {
$this->deleteComment($comment_new_page);
$this->drupalGet('node/' . $this->node->nid);
- $this->assertFalse($this->commentExists($comment), t('Comment not found.'));
- $this->assertFalse($this->commentExists($reply, TRUE), t('Reply not found.'));
+ $this->assertFalse($this->commentExists($comment), 'Comment not found.');
+ $this->assertFalse($this->commentExists($reply, TRUE), 'Reply not found.');
// Enabled comment form on node page.
$this->drupalLogin($this->admin_user);
@@ -407,7 +408,7 @@ class CommentInterfaceTest extends CommentHelperCase {
$this->drupalLogin($this->web_user);
$this->drupalGet('node/' . $this->node->nid);
$form_comment = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
- $this->assertTrue($this->commentExists($form_comment), t('Form comment found.'));
+ $this->assertTrue($this->commentExists($form_comment), 'Form comment found.');
// Disable comment form on node page.
$this->drupalLogout();
@@ -428,7 +429,7 @@ class CommentInterfaceTest extends CommentHelperCase {
$this->assertNoLink(t('@count new comments', array('@count' => 0)));
$this->assertLink(t('Read more'));
$count = $this->xpath('//div[@id=:id]/div[@class=:class]/ul/li', array(':id' => 'node-' . $this->node->nid, ':class' => 'link-wrapper'));
- $this->assertTrue(count($count) == 1, t('One child found'));
+ $this->assertTrue(count($count) == 1, 'One child found');
// Create a new comment. This helper function may be run with different
// comment settings so use comment_save() to avoid complex setup.
@@ -452,8 +453,8 @@ class CommentInterfaceTest extends CommentHelperCase {
$this->drupalGet('node');
$this->assertLink(t('1 new comment'));
$this->clickLink(t('1 new comment'));
- $this->assertRaw('<a id="new"></a>', t('Found "new" marker.'));
- $this->assertTrue($this->xpath('//a[@id=:new]/following-sibling::a[1][@id=:comment_id]', array(':new' => 'new', ':comment_id' => 'comment-1')), t('The "new" anchor is positioned at the right comment.'));
+ $this->assertRaw('<a id="new"></a>', 'Found "new" marker.');
+ $this->assertTrue($this->xpath('//a[@id=:new]/following-sibling::a[1][@id=:comment_id]', array(':new' => 'new', ':comment_id' => 'comment-1')), 'The "new" anchor is positioned at the right comment.');
// Test if "new comment" link is correctly removed.
$this->drupalGet('node');
@@ -590,10 +591,10 @@ class CommentInterfaceTest extends CommentHelperCase {
// Checks the initial values of node comment statistics with no comment.
$node = node_load($this->node->nid);
- $this->assertEqual($node->last_comment_timestamp, $this->node->created, t('The initial value of node last_comment_timestamp is the node created date.'));
- $this->assertEqual($node->last_comment_name, NULL, t('The initial value of node last_comment_name is NULL.'));
- $this->assertEqual($node->last_comment_uid, $this->web_user->uid, t('The initial value of node last_comment_uid is the node uid.'));
- $this->assertEqual($node->comment_count, 0, t('The initial value of node comment_count is zero.'));
+ $this->assertEqual($node->last_comment_timestamp, $this->node->created, 'The initial value of node last_comment_timestamp is the node created date.');
+ $this->assertEqual($node->last_comment_name, NULL, 'The initial value of node last_comment_name is NULL.');
+ $this->assertEqual($node->last_comment_uid, $this->web_user->uid, 'The initial value of node last_comment_uid is the node uid.');
+ $this->assertEqual($node->comment_count, 0, 'The initial value of node comment_count is zero.');
// Post comment #1 as web_user2.
$this->drupalLogin($this->web_user2);
@@ -604,9 +605,9 @@ class CommentInterfaceTest extends CommentHelperCase {
// Checks the new values of node comment statistics with comment #1.
// The node needs to be reloaded with a node_load_multiple cache reset.
$node = node_load($this->node->nid, NULL, TRUE);
- $this->assertEqual($node->last_comment_name, NULL, t('The value of node last_comment_name is NULL.'));
- $this->assertEqual($node->last_comment_uid, $this->web_user2->uid, t('The value of node last_comment_uid is the comment #1 uid.'));
- $this->assertEqual($node->comment_count, 1, t('The value of node comment_count is 1.'));
+ $this->assertEqual($node->last_comment_name, NULL, 'The value of node last_comment_name is NULL.');
+ $this->assertEqual($node->last_comment_uid, $this->web_user2->uid, 'The value of node last_comment_uid is the comment #1 uid.');
+ $this->assertEqual($node->comment_count, 1, 'The value of node comment_count is 1.');
// Prepare for anonymous comment submission (comment approval enabled).
variable_set('user_register', USER_REGISTER_VISITORS);
@@ -629,9 +630,9 @@ class CommentInterfaceTest extends CommentHelperCase {
// ensure they haven't changed since the comment has not been moderated.
// The node needs to be reloaded with a node_load_multiple cache reset.
$node = node_load($this->node->nid, NULL, TRUE);
- $this->assertEqual($node->last_comment_name, NULL, t('The value of node last_comment_name is still NULL.'));
- $this->assertEqual($node->last_comment_uid, $this->web_user2->uid, t('The value of node last_comment_uid is still the comment #1 uid.'));
- $this->assertEqual($node->comment_count, 1, t('The value of node comment_count is still 1.'));
+ $this->assertEqual($node->last_comment_name, NULL, 'The value of node last_comment_name is still NULL.');
+ $this->assertEqual($node->last_comment_uid, $this->web_user2->uid, 'The value of node last_comment_uid is still the comment #1 uid.');
+ $this->assertEqual($node->comment_count, 1, 'The value of node comment_count is still 1.');
// Prepare for anonymous comment submission (no approval required).
$this->drupalLogin($this->admin_user);
@@ -650,9 +651,9 @@ class CommentInterfaceTest extends CommentHelperCase {
// Checks the new values of node comment statistics with comment #3.
// The node needs to be reloaded with a node_load_multiple cache reset.
$node = node_load($this->node->nid, NULL, TRUE);
- $this->assertEqual($node->last_comment_name, $comment_loaded->name, t('The value of node last_comment_name is the name of the anonymous user.'));
- $this->assertEqual($node->last_comment_uid, 0, t('The value of node last_comment_uid is zero.'));
- $this->assertEqual($node->comment_count, 2, t('The value of node comment_count is 2.'));
+ $this->assertEqual($node->last_comment_name, $comment_loaded->name, 'The value of node last_comment_name is the name of the anonymous user.');
+ $this->assertEqual($node->last_comment_uid, 0, 'The value of node last_comment_uid is zero.');
+ $this->assertEqual($node->comment_count, 2, 'The value of node comment_count is 2.');
}
/**
@@ -919,10 +920,10 @@ class CommentInterfaceTest extends CommentHelperCase {
if ($path == "node/$nid") {
$elements = $this->xpath('//form[@id=:id]', array(':id' => 'comment-form'));
if ($info['form'] == COMMENT_FORM_BELOW) {
- $this->assertTrue(count($elements), t('Comment form found below.'));
+ $this->assertTrue(count($elements), 'Comment form found below.');
}
else {
- $this->assertFalse(count($elements), t('Comment form not found below.'));
+ $this->assertFalse(count($elements), 'Comment form not found below.');
}
}
}
@@ -974,13 +975,13 @@ class CommentPreviewTest extends CommentHelperCase {
$this->drupalPost('node/' . $this->node->nid, $edit, t('Preview'));
// Check that the preview is displaying the title and body.
- $this->assertTitle(t('Preview comment | Drupal'), t('Page title is "Preview comment".'));
- $this->assertText($edit['subject'], t('Subject displayed.'));
- $this->assertText($edit['comment_body[' . $langcode . '][0][value]'], t('Comment displayed.'));
+ $this->assertTitle(t('Preview comment | Drupal'), 'Page title is "Preview comment".');
+ $this->assertText($edit['subject'], 'Subject displayed.');
+ $this->assertText($edit['comment_body[' . $langcode . '][0][value]'], 'Comment displayed.');
// Check that the title and body fields are displayed with the correct values.
- $this->assertFieldByName('subject', $edit['subject'], t('Subject field displayed.'));
- $this->assertFieldByName('comment_body[' . $langcode . '][0][value]', $edit['comment_body[' . $langcode . '][0][value]'], t('Comment field displayed.'));
+ $this->assertFieldByName('subject', $edit['subject'], 'Subject field displayed.');
+ $this->assertFieldByName('comment_body[' . $langcode . '][0][value]', $edit['comment_body[' . $langcode . '][0][value]'], 'Comment field displayed.');
// Check that the signature is displaying with the correct text format.
$this->assertLink($test_signature);
@@ -1013,28 +1014,28 @@ class CommentPreviewTest extends CommentHelperCase {
$this->drupalPost('comment/' . $comment->id . '/edit', $edit, t('Preview'));
// Check that the preview is displaying the subject, comment, author and date correctly.
- $this->assertTitle(t('Preview comment | Drupal'), t('Page title is "Preview comment".'));
- $this->assertText($edit['subject'], t('Subject displayed.'));
- $this->assertText($edit['comment_body[' . $langcode . '][0][value]'], t('Comment displayed.'));
- $this->assertText($edit['name'], t('Author displayed.'));
- $this->assertText($expected_text_date, t('Date displayed.'));
+ $this->assertTitle(t('Preview comment | Drupal'), 'Page title is "Preview comment".');
+ $this->assertText($edit['subject'], 'Subject displayed.');
+ $this->assertText($edit['comment_body[' . $langcode . '][0][value]'], 'Comment displayed.');
+ $this->assertText($edit['name'], 'Author displayed.');
+ $this->assertText($expected_text_date, 'Date displayed.');
// Check that the subject, comment, author and date fields are displayed with the correct values.
- $this->assertFieldByName('subject', $edit['subject'], t('Subject field displayed.'));
- $this->assertFieldByName('comment_body[' . $langcode . '][0][value]', $edit['comment_body[' . $langcode . '][0][value]'], t('Comment field displayed.'));
- $this->assertFieldByName('name', $edit['name'], t('Author field displayed.'));
- $this->assertFieldByName('date', $edit['date'], t('Date field displayed.'));
+ $this->assertFieldByName('subject', $edit['subject'], 'Subject field displayed.');
+ $this->assertFieldByName('comment_body[' . $langcode . '][0][value]', $edit['comment_body[' . $langcode . '][0][value]'], 'Comment field displayed.');
+ $this->assertFieldByName('name', $edit['name'], 'Author field displayed.');
+ $this->assertFieldByName('date', $edit['date'], 'Date field displayed.');
// Check that saving a comment produces a success message.
$this->drupalPost('comment/' . $comment->id . '/edit', $edit, t('Save'));
- $this->assertText(t('Your comment has been posted.'), t('Comment posted.'));
+ $this->assertText(t('Your comment has been posted.'), 'Comment posted.');
// Check that the comment fields are correct after loading the saved comment.
$this->drupalGet('comment/' . $comment->id . '/edit');
- $this->assertFieldByName('subject', $edit['subject'], t('Subject field displayed.'));
- $this->assertFieldByName('comment_body[' . $langcode . '][0][value]', $edit['comment_body[' . $langcode . '][0][value]'], t('Comment field displayed.'));
- $this->assertFieldByName('name', $edit['name'], t('Author field displayed.'));
- $this->assertFieldByName('date', $expected_form_date, t('Date field displayed.'));
+ $this->assertFieldByName('subject', $edit['subject'], 'Subject field displayed.');
+ $this->assertFieldByName('comment_body[' . $langcode . '][0][value]', $edit['comment_body[' . $langcode . '][0][value]'], 'Comment field displayed.');
+ $this->assertFieldByName('name', $edit['name'], 'Author field displayed.');
+ $this->assertFieldByName('date', $expected_form_date, 'Date field displayed.');
// Submit the form using the displayed values.
$displayed = array();
@@ -1046,10 +1047,10 @@ class CommentPreviewTest extends CommentHelperCase {
// Check that the saved comment is still correct.
$comment_loaded = comment_load($comment->id);
- $this->assertEqual($comment_loaded->subject, $edit['subject'], t('Subject loaded.'));
- $this->assertEqual($comment_loaded->comment_body[$langcode][0]['value'], $edit['comment_body[' . $langcode . '][0][value]'], t('Comment body loaded.'));
- $this->assertEqual($comment_loaded->name, $edit['name'], t('Name loaded.'));
- $this->assertEqual($comment_loaded->created, $raw_date, t('Date loaded.'));
+ $this->assertEqual($comment_loaded->subject, $edit['subject'], 'Subject loaded.');
+ $this->assertEqual($comment_loaded->comment_body[$langcode][0]['value'], $edit['comment_body[' . $langcode . '][0][value]'], 'Comment body loaded.');
+ $this->assertEqual($comment_loaded->name, $edit['name'], 'Name loaded.');
+ $this->assertEqual($comment_loaded->created, $raw_date, 'Date loaded.');
}
@@ -1085,7 +1086,7 @@ class CommentAnonymous extends CommentHelperCase {
// Post anonymous comment without contact info.
$anonymous_comment1 = $this->postComment($this->node, $this->randomName(), $this->randomName());
- $this->assertTrue($this->commentExists($anonymous_comment1), t('Anonymous comment without contact info found.'));
+ $this->assertTrue($this->commentExists($anonymous_comment1), 'Anonymous comment without contact info found.');
// Allow contact info.
$this->drupalLogin($this->admin_user);
@@ -1094,15 +1095,15 @@ class CommentAnonymous extends CommentHelperCase {
// Attempt to edit anonymous comment.
$this->drupalGet('comment/' . $anonymous_comment1->id . '/edit');
$edited_comment = $this->postComment(NULL, $this->randomName(), $this->randomName());
- $this->assertTrue($this->commentExists($edited_comment, FALSE), t('Modified reply found.'));
+ $this->assertTrue($this->commentExists($edited_comment, FALSE), 'Modified reply found.');
$this->drupalLogout();
// Post anonymous comment with contact info (optional).
$this->drupalGet('comment/reply/' . $this->node->nid);
- $this->assertTrue($this->commentContactInfoAvailable(), t('Contact information available.'));
+ $this->assertTrue($this->commentContactInfoAvailable(), 'Contact information available.');
$anonymous_comment2 = $this->postComment($this->node, $this->randomName(), $this->randomName());
- $this->assertTrue($this->commentExists($anonymous_comment2), t('Anonymous comment with contact info (optional) found.'));
+ $this->assertTrue($this->commentExists($anonymous_comment2), 'Anonymous comment with contact info (optional) found.');
// Ensure anonymous users cannot post in the name of registered users.
$langcode = LANGUAGE_NONE;
@@ -1122,41 +1123,42 @@ class CommentAnonymous extends CommentHelperCase {
// Try to post comment with contact info (required).
$this->drupalGet('comment/reply/' . $this->node->nid);
- $this->assertTrue($this->commentContactInfoAvailable(), t('Contact information available.'));
+ $this->assertTrue($this->commentContactInfoAvailable(), 'Contact information available.');
$anonymous_comment3 = $this->postComment($this->node, $this->randomName(), $this->randomName(), TRUE);
- $this->assertText(t('E-mail field is required.'), t('E-mail required.')); // Name should have 'Anonymous' for value by default.
- $this->assertFalse($this->commentExists($anonymous_comment3), t('Anonymous comment with contact info (required) not found.'));
+ // Name should have 'Anonymous' for value by default.
+ $this->assertText(t('E-mail field is required.'), 'E-mail required.');
+ $this->assertFalse($this->commentExists($anonymous_comment3), 'Anonymous comment with contact info (required) not found.');
// Post comment with contact info (required).
$author_name = $this->randomName();
$author_mail = $this->randomName() . '@example.com';
$anonymous_comment3 = $this->postComment($this->node, $this->randomName(), $this->randomName(), array('name' => $author_name, 'mail' => $author_mail));
- $this->assertTrue($this->commentExists($anonymous_comment3), t('Anonymous comment with contact info (required) found.'));
+ $this->assertTrue($this->commentExists($anonymous_comment3), 'Anonymous comment with contact info (required) found.');
// Make sure the user data appears correctly when editing the comment.
$this->drupalLogin($this->admin_user);
$this->drupalGet('comment/' . $anonymous_comment3->id . '/edit');
- $this->assertRaw($author_name, t("The anonymous user's name is correct when editing the comment."));
- $this->assertRaw($author_mail, t("The anonymous user's e-mail address is correct when editing the comment."));
+ $this->assertRaw($author_name, "The anonymous user's name is correct when editing the comment.");
+ $this->assertRaw($author_mail, "The anonymous user's e-mail address is correct when editing the comment.");
// Unpublish comment.
$this->performCommentOperation($anonymous_comment3, 'unpublish');
$this->drupalGet('admin/content/comment/approval');
- $this->assertRaw('comments[' . $anonymous_comment3->id . ']', t('Comment was unpublished.'));
+ $this->assertRaw('comments[' . $anonymous_comment3->id . ']', 'Comment was unpublished.');
// Publish comment.
$this->performCommentOperation($anonymous_comment3, 'publish', TRUE);
$this->drupalGet('admin/content/comment');
- $this->assertRaw('comments[' . $anonymous_comment3->id . ']', t('Comment was published.'));
+ $this->assertRaw('comments[' . $anonymous_comment3->id . ']', 'Comment was published.');
// Delete comment.
$this->performCommentOperation($anonymous_comment3, 'delete');
$this->drupalGet('admin/content/comment');
- $this->assertNoRaw('comments[' . $anonymous_comment3->id . ']', t('Comment was deleted.'));
+ $this->assertNoRaw('comments[' . $anonymous_comment3->id . ']', 'Comment was deleted.');
$this->drupalLogout();
// Reset.
@@ -1170,14 +1172,14 @@ class CommentAnonymous extends CommentHelperCase {
// NOTE: if authenticated user has permission to post comments, then a
// "Login or register to post comments" type link may be shown.
$this->drupalGet('node/' . $this->node->nid);
- $this->assertNoPattern('@<h2[^>]*>Comments</h2>@', t('Comments were not displayed.'));
- $this->assertNoLink('Add new comment', t('Link to add comment was found.'));
+ $this->assertNoPattern('@<h2[^>]*>Comments</h2>@', 'Comments were not displayed.');
+ $this->assertNoLink('Add new comment', 'Link to add comment was found.');
// Attempt to view node-comment form while disallowed.
$this->drupalGet('comment/reply/' . $this->node->nid);
- $this->assertText('You are not authorized to post comments', t('Error attempting to post comment.'));
- $this->assertNoFieldByName('subject', '', t('Subject field not found.'));
- $this->assertNoFieldByName("comment_body[$langcode][0][value]", '', t('Comment field not found.'));
+ $this->assertText('You are not authorized to post comments', 'Error attempting to post comment.');
+ $this->assertNoFieldByName('subject', '', 'Subject field not found.');
+ $this->assertNoFieldByName("comment_body[$langcode][0][value]", '', 'Comment field not found.');
user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
'access comments' => TRUE,
@@ -1185,9 +1187,9 @@ class CommentAnonymous extends CommentHelperCase {
'skip comment approval' => FALSE,
));
$this->drupalGet('node/' . $this->node->nid);
- $this->assertPattern('@<h2[^>]*>Comments</h2>@', t('Comments were displayed.'));
- $this->assertLink('Log in', 1, t('Link to log in was found.'));
- $this->assertLink('register', 1, t('Link to register was found.'));
+ $this->assertPattern('@<h2[^>]*>Comments</h2>@', 'Comments were displayed.');
+ $this->assertLink('Log in', 1, 'Link to log in was found.');
+ $this->assertLink('register', 1, 'Link to register was found.');
user_role_change_permissions(DRUPAL_ANONYMOUS_RID, array(
'access comments' => FALSE,
@@ -1195,13 +1197,13 @@ class CommentAnonymous extends CommentHelperCase {
'skip comment approval' => TRUE,
));
$this->drupalGet('node/' . $this->node->nid);
- $this->assertNoPattern('@<h2[^>]*>Comments</h2>@', t('Comments were not displayed.'));
- $this->assertFieldByName('subject', '', t('Subject field found.'));
- $this->assertFieldByName("comment_body[$langcode][0][value]", '', t('Comment field found.'));
+ $this->assertNoPattern('@<h2[^>]*>Comments</h2>@', 'Comments were not displayed.');
+ $this->assertFieldByName('subject', '', 'Subject field found.');
+ $this->assertFieldByName("comment_body[$langcode][0][value]", '', 'Comment field found.');
$this->drupalGet('comment/reply/' . $this->node->nid . '/' . $anonymous_comment3->id);
- $this->assertText('You are not authorized to view comments', t('Error attempting to post reply.'));
- $this->assertNoText($author_name, t('Comment not displayed.'));
+ $this->assertText('You are not authorized to view comments', 'Error attempting to post reply.');
+ $this->assertNoText($author_name, 'Comment not displayed.');
}
}
@@ -1245,22 +1247,22 @@ class CommentPagerTest extends CommentHelperCase {
// Check the first page of the node, and confirm the correct comments are
// shown.
$this->drupalGet('node/' . $node->nid);
- $this->assertRaw(t('next'), t('Paging links found.'));
- $this->assertTrue($this->commentExists($comments[0]), t('Comment 1 appears on page 1.'));
- $this->assertFalse($this->commentExists($comments[1]), t('Comment 2 does not appear on page 1.'));
- $this->assertFalse($this->commentExists($comments[2]), t('Comment 3 does not appear on page 1.'));
+ $this->assertRaw(t('next'), 'Paging links found.');
+ $this->assertTrue($this->commentExists($comments[0]), 'Comment 1 appears on page 1.');
+ $this->assertFalse($this->commentExists($comments[1]), 'Comment 2 does not appear on page 1.');
+ $this->assertFalse($this->commentExists($comments[2]), 'Comment 3 does not appear on page 1.');
// Check the second page.
$this->drupalGet('node/' . $node->nid, array('query' => array('page' => 1)));
- $this->assertTrue($this->commentExists($comments[1]), t('Comment 2 appears on page 2.'));
- $this->assertFalse($this->commentExists($comments[0]), t('Comment 1 does not appear on page 2.'));
- $this->assertFalse($this->commentExists($comments[2]), t('Comment 3 does not appear on page 2.'));
+ $this->assertTrue($this->commentExists($comments[1]), 'Comment 2 appears on page 2.');
+ $this->assertFalse($this->commentExists($comments[0]), 'Comment 1 does not appear on page 2.');
+ $this->assertFalse($this->commentExists($comments[2]), 'Comment 3 does not appear on page 2.');
// Check the third page.
$this->drupalGet('node/' . $node->nid, array('query' => array('page' => 2)));
- $this->assertTrue($this->commentExists($comments[2]), t('Comment 3 appears on page 3.'));
- $this->assertFalse($this->commentExists($comments[0]), t('Comment 1 does not appear on page 3.'));
- $this->assertFalse($this->commentExists($comments[1]), t('Comment 2 does not appear on page 3.'));
+ $this->assertTrue($this->commentExists($comments[2]), 'Comment 3 appears on page 3.');
+ $this->assertFalse($this->commentExists($comments[0]), 'Comment 1 does not appear on page 3.');
+ $this->assertFalse($this->commentExists($comments[1]), 'Comment 2 does not appear on page 3.');
// Post a reply to the oldest comment and test again.
$replies = array();
@@ -1272,21 +1274,21 @@ class CommentPagerTest extends CommentHelperCase {
// We are still in flat view - the replies should not be on the first page,
// even though they are replies to the oldest comment.
$this->drupalGet('node/' . $node->nid, array('query' => array('page' => 0)));
- $this->assertFalse($this->commentExists($reply, TRUE), t('In flat mode, reply does not appear on page 1.'));
+ $this->assertFalse($this->commentExists($reply, TRUE), 'In flat mode, reply does not appear on page 1.');
// If we switch to threaded mode, the replies on the oldest comment
// should be bumped to the first page and comment 6 should be bumped
// to the second page.
$this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, t('Switched to threaded mode.'));
$this->drupalGet('node/' . $node->nid, array('query' => array('page' => 0)));
- $this->assertTrue($this->commentExists($reply, TRUE), t('In threaded mode, reply appears on page 1.'));
- $this->assertFalse($this->commentExists($comments[1]), t('In threaded mode, comment 2 has been bumped off of page 1.'));
+ $this->assertTrue($this->commentExists($reply, TRUE), 'In threaded mode, reply appears on page 1.');
+ $this->assertFalse($this->commentExists($comments[1]), 'In threaded mode, comment 2 has been bumped off of page 1.');
// If (# replies > # comments per page) in threaded expanded view,
// the overage should be bumped.
$reply2 = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
$this->drupalGet('node/' . $node->nid, array('query' => array('page' => 0)));
- $this->assertFalse($this->commentExists($reply2, TRUE), t('In threaded mode where # replies > # comments per page, the newest reply does not appear on page 1.'));
+ $this->assertFalse($this->commentExists($reply2, TRUE), 'In threaded mode where # replies > # comments per page, the newest reply does not appear on page 1.');
$this->drupalLogout();
}
@@ -1388,7 +1390,7 @@ class CommentPagerTest extends CommentHelperCase {
$result_order[] = substr($anchor['id'], 8);
}
- return $this->assertIdentical($expected_cids, $result_order, t('Comment order: expected @expected, returned @returned.', array('@expected' => implode(',', $expected_cids), '@returned' => implode(',', $result_order))));
+ return $this->assertIdentical($expected_cids, $result_order, format_string('Comment order: expected @expected, returned @returned.', array('@expected' => implode(',', $expected_cids), '@returned' => implode(',', $result_order))));
}
/**
@@ -1448,7 +1450,7 @@ class CommentPagerTest extends CommentHelperCase {
foreach ($expected_pages as $new_replies => $expected_page) {
$returned = comment_new_page_count($node->comment_count, $new_replies, $node);
$returned_page = is_array($returned) ? $returned['page'] : 0;
- $this->assertIdentical($expected_page, $returned_page, t('Flat mode, @new replies: expected page @expected, returned page @returned.', array('@new' => $new_replies, '@expected' => $expected_page, '@returned' => $returned_page)));
+ $this->assertIdentical($expected_page, $returned_page, format_string('Flat mode, @new replies: expected page @expected, returned page @returned.', array('@new' => $new_replies, '@expected' => $expected_page, '@returned' => $returned_page)));
}
$this->setCommentSettings('comment_default_mode', COMMENT_MODE_THREADED, t('Switched to threaded mode.'));
@@ -1466,7 +1468,7 @@ class CommentPagerTest extends CommentHelperCase {
foreach ($expected_pages as $new_replies => $expected_page) {
$returned = comment_new_page_count($node->comment_count, $new_replies, $node);
$returned_page = is_array($returned) ? $returned['page'] : 0;
- $this->assertEqual($expected_page, $returned_page, t('Threaded mode, @new replies: expected page @expected, returned page @returned.', array('@new' => $new_replies, '@expected' => $expected_page, '@returned' => $returned_page)));
+ $this->assertEqual($expected_page, $returned_page, format_string('Threaded mode, @new replies: expected page @expected, returned page @returned.', array('@new' => $new_replies, '@expected' => $expected_page, '@returned' => $returned_page)));
}
}
}
@@ -1516,12 +1518,12 @@ class CommentNodeAccessTest extends CommentHelperCase {
$comment_subject = $this->randomName();
$comment = $this->postComment($this->node, $comment_text, $comment_subject);
$comment_loaded = comment_load($comment->id);
- $this->assertTrue($this->commentExists($comment), t('Comment found.'));
+ $this->assertTrue($this->commentExists($comment), 'Comment found.');
// Check comment display.
$this->drupalGet('node/' . $this->node->nid . '/' . $comment->id);
- $this->assertText($comment_subject, t('Individual comment subject found.'));
- $this->assertText($comment_text, t('Individual comment body found.'));
+ $this->assertText($comment_subject, 'Individual comment subject found.');
+ $this->assertText($comment_text, 'Individual comment body found.');
// Reply to comment, creating second comment.
$this->drupalGet('comment/reply/' . $this->node->nid . '/' . $comment->id);
@@ -1529,7 +1531,7 @@ class CommentNodeAccessTest extends CommentHelperCase {
$reply_subject = $this->randomName();
$reply = $this->postComment(NULL, $reply_text, $reply_subject, TRUE);
$reply_loaded = comment_load($reply->id);
- $this->assertTrue($this->commentExists($reply, TRUE), t('Reply found.'));
+ $this->assertTrue($this->commentExists($reply, TRUE), 'Reply found.');
// Go to the node page and verify comment and reply are visible.
$this->drupalGet('node/' . $this->node->nid);
@@ -1572,7 +1574,7 @@ class CommentApprovalTest extends CommentHelperCase {
$subject = $this->randomName();
$body = $this->randomName();
$this->postComment($this->node, $body, $subject, TRUE); // Set $contact to true so that it won't check for id and message.
- $this->assertText(t('Your comment has been queued for review by site administrators and will be published after approval.'), t('Comment requires approval.'));
+ $this->assertText(t('Your comment has been queued for review by site administrators and will be published after approval.'), 'Comment requires approval.');
// Get unapproved comment id.
$this->drupalLogin($this->admin_user);
@@ -1580,7 +1582,7 @@ class CommentApprovalTest extends CommentHelperCase {
$anonymous_comment4 = (object) array('id' => $anonymous_comment4, 'subject' => $subject, 'comment' => $body);
$this->drupalLogout();
- $this->assertFalse($this->commentExists($anonymous_comment4), t('Anonymous comment was not published.'));
+ $this->assertFalse($this->commentExists($anonymous_comment4), 'Anonymous comment was not published.');
// Approve comment.
$this->drupalLogin($this->admin_user);
@@ -1588,7 +1590,7 @@ class CommentApprovalTest extends CommentHelperCase {
$this->drupalLogout();
$this->drupalGet('node/' . $this->node->nid);
- $this->assertTrue($this->commentExists($anonymous_comment4), t('Anonymous comment visible.'));
+ $this->assertTrue($this->commentExists($anonymous_comment4), 'Anonymous comment visible.');
// Post 2 anonymous comments without contact info.
$comments[] = $this->postComment($this->node, $this->randomName(), $this->randomName(), TRUE);
@@ -1597,13 +1599,13 @@ class CommentApprovalTest extends CommentHelperCase {
// Publish multiple comments in one operation.
$this->drupalLogin($this->admin_user);
$this->drupalGet('admin/content/comment/approval');
- $this->assertText(t('Unapproved comments (@count)', array('@count' => 2)), t('Two unapproved comments waiting for approval.'));
+ $this->assertText(t('Unapproved comments (@count)', array('@count' => 2)), 'Two unapproved comments waiting for approval.');
$edit = array(
"comments[{$comments[0]->id}]" => 1,
"comments[{$comments[1]->id}]" => 1,
);
$this->drupalPost(NULL, $edit, t('Update'));
- $this->assertText(t('Unapproved comments (@count)', array('@count' => 0)), t('All comments were approved.'));
+ $this->assertText(t('Unapproved comments (@count)', array('@count' => 0)), 'All comments were approved.');
// Delete multiple comments in one operation.
$edit = array(
@@ -1613,9 +1615,9 @@ class CommentApprovalTest extends CommentHelperCase {
"comments[{$anonymous_comment4->id}]" => 1,
);
$this->drupalPost(NULL, $edit, t('Update'));
- $this->assertText(t('Are you sure you want to delete these comments and all their children?'), t('Confirmation required.'));
+ $this->assertText(t('Are you sure you want to delete these comments and all their children?'), 'Confirmation required.');
$this->drupalPost(NULL, $edit, t('Delete comments'));
- $this->assertText(t('No comments available.'), t('All comments were deleted.'));
+ $this->assertText(t('No comments available.'), 'All comments were deleted.');
}
/**
@@ -1636,7 +1638,7 @@ class CommentApprovalTest extends CommentHelperCase {
$subject = $this->randomName();
$body = $this->randomName();
$this->postComment($this->node, $body, $subject, TRUE); // Set $contact to true so that it won't check for id and message.
- $this->assertText(t('Your comment has been queued for review by site administrators and will be published after approval.'), t('Comment requires approval.'));
+ $this->assertText(t('Your comment has been queued for review by site administrators and will be published after approval.'), 'Comment requires approval.');
// Get unapproved comment id.
$this->drupalLogin($this->admin_user);
@@ -1644,20 +1646,20 @@ class CommentApprovalTest extends CommentHelperCase {
$anonymous_comment4 = (object) array('id' => $anonymous_comment4, 'subject' => $subject, 'comment' => $body);
$this->drupalLogout();
- $this->assertFalse($this->commentExists($anonymous_comment4), t('Anonymous comment was not published.'));
+ $this->assertFalse($this->commentExists($anonymous_comment4), 'Anonymous comment was not published.');
// Approve comment.
$this->drupalLogin($this->admin_user);
$this->drupalGet('comment/1/approve');
- $this->assertResponse(403, t('Forged comment approval was denied.'));
+ $this->assertResponse(403, 'Forged comment approval was denied.');
$this->drupalGet('comment/1/approve', array('query' => array('token' => 'forged')));
- $this->assertResponse(403, t('Forged comment approval was denied.'));
+ $this->assertResponse(403, 'Forged comment approval was denied.');
$this->drupalGet('node/' . $this->node->nid);
$this->clickLink(t('approve'));
$this->drupalLogout();
$this->drupalGet('node/' . $this->node->nid);
- $this->assertTrue($this->commentExists($anonymous_comment4), t('Anonymous comment visible.'));
+ $this->assertTrue($this->commentExists($anonymous_comment4), 'Anonymous comment visible.');
}
}
@@ -1684,7 +1686,7 @@ class CommentBlockFunctionalTest extends CommentHelperCase {
'blocks[comment_recent][region]' => 'sidebar_first',
);
$this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
- $this->assertText(t('The block settings have been updated.'), t('Block saved to first sidebar region.'));
+ $this->assertText(t('The block settings have been updated.'), 'Block saved to first sidebar region.');
// Set block title and variables.
$block = array(
@@ -1692,7 +1694,7 @@ class CommentBlockFunctionalTest extends CommentHelperCase {
'comment_block_count' => 2,
);
$this->drupalPost('admin/structure/block/manage/comment/recent/configure', $block, t('Save block'));
- $this->assertText(t('The block configuration has been saved.'), t('Block saved.'));
+ $this->assertText(t('The block configuration has been saved.'), 'Block saved.');
// Add some test comments, one without a subject.
$comment1 = $this->postComment($this->node, $this->randomName(), $this->randomName());
@@ -1704,20 +1706,20 @@ class CommentBlockFunctionalTest extends CommentHelperCase {
$this->drupalLogout();
user_role_revoke_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
$this->drupalGet('');
- $this->assertNoText($block['title'], t('Block was not found.'));
+ $this->assertNoText($block['title'], 'Block was not found.');
user_role_grant_permissions(DRUPAL_ANONYMOUS_RID, array('access comments'));
// Test that a user with the 'access comments' permission can see the
// block.
$this->drupalLogin($this->web_user);
$this->drupalGet('');
- $this->assertText($block['title'], t('Block was found.'));
+ $this->assertText($block['title'], 'Block was found.');
// Test the only the 2 latest comments are shown and in the proper order.
- $this->assertNoText($comment1->subject, t('Comment not found in block.'));
- $this->assertText($comment2->subject, t('Comment found in block.'));
- $this->assertText($comment3->comment, t('Comment found in block.'));
- $this->assertTrue(strpos($this->drupalGetContent(), $comment3->comment) < strpos($this->drupalGetContent(), $comment2->subject), t('Comments were ordered correctly in block.'));
+ $this->assertNoText($comment1->subject, 'Comment not found in block.');
+ $this->assertText($comment2->subject, 'Comment found in block.');
+ $this->assertText($comment3->comment, 'Comment found in block.');
+ $this->assertTrue(strpos($this->drupalGetContent(), $comment3->comment) < strpos($this->drupalGetContent(), $comment2->subject), 'Comments were ordered correctly in block.');
// Set the number of recent comments to show to 10.
$this->drupalLogout();
@@ -1726,30 +1728,30 @@ class CommentBlockFunctionalTest extends CommentHelperCase {
'comment_block_count' => 10,
);
$this->drupalPost('admin/structure/block/manage/comment/recent/configure', $block, t('Save block'));
- $this->assertText(t('The block configuration has been saved.'), t('Block saved.'));
+ $this->assertText(t('The block configuration has been saved.'), 'Block saved.');
// Post an additional comment.
$comment4 = $this->postComment($this->node, $this->randomName(), $this->randomName());
// Test that all four comments are shown.
- $this->assertText($comment1->subject, t('Comment found in block.'));
- $this->assertText($comment2->subject, t('Comment found in block.'));
- $this->assertText($comment3->comment, t('Comment found in block.'));
- $this->assertText($comment4->subject, t('Comment found in block.'));
+ $this->assertText($comment1->subject, 'Comment found in block.');
+ $this->assertText($comment2->subject, 'Comment found in block.');
+ $this->assertText($comment3->comment, 'Comment found in block.');
+ $this->assertText($comment4->subject, 'Comment found in block.');
// Test that links to comments work when comments are across pages.
$this->setCommentsPerPage(1);
$this->drupalGet('');
$this->clickLink($comment1->subject);
- $this->assertText($comment1->subject, t('Comment link goes to correct page.'));
+ $this->assertText($comment1->subject, 'Comment link goes to correct page.');
$this->drupalGet('');
$this->clickLink($comment2->subject);
- $this->assertText($comment2->subject, t('Comment link goes to correct page.'));
+ $this->assertText($comment2->subject, 'Comment link goes to correct page.');
$this->clickLink($comment4->subject);
- $this->assertText($comment4->subject, t('Comment link goes to correct page.'));
+ $this->assertText($comment4->subject, 'Comment link goes to correct page.');
// Check that when viewing a comment page from a link to the comment, that
// rel="canonical" is added to the head of the document.
- $this->assertRaw('<link rel="canonical"', t('Canonical URL was found in the HTML head'));
+ $this->assertRaw('<link rel="canonical"', 'Canonical URL was found in the HTML head');
}
}
@@ -1774,13 +1776,13 @@ class CommentRSSUnitTest extends CommentHelperCase {
$comment = $this->postComment($this->node, $this->randomName(), $this->randomName());
$this->drupalGet('rss.xml');
$raw = '<comments>' . url('node/' . $this->node->nid, array('fragment' => 'comments', 'absolute' => TRUE)) . '</comments>';
- $this->assertRaw($raw, t('Comments as part of RSS feed.'));
+ $this->assertRaw($raw, 'Comments as part of RSS feed.');
// Hide comments from RSS feed and check presence.
$this->node->comment = COMMENT_NODE_HIDDEN;
node_save($this->node);
$this->drupalGet('rss.xml');
- $this->assertNoRaw($raw, t('Hidden comments is not a part of RSS feed.'));
+ $this->assertNoRaw($raw, 'Hidden comments is not a part of RSS feed.');
}
}
@@ -1814,14 +1816,14 @@ class CommentContentRebuild extends CommentHelperCase {
$comment_text = $this->randomName();
$comment = $this->postComment($this->node, $comment_text, $subject_text, TRUE);
$comment_loaded = comment_load($comment->id);
- $this->assertTrue($this->commentExists($comment), t('Comment found.'));
+ $this->assertTrue($this->commentExists($comment), 'Comment found.');
// Add the property to the content array and then see if it still exists on build.
$comment_loaded->content['test_property'] = array('#value' => $this->randomString());
$built_content = comment_view($comment_loaded, $this->node);
// This means that the content was rebuilt as the added test property no longer exists.
- $this->assertFalse(isset($built_content['test_property']), t('Comment content was emptied before being built.'));
+ $this->assertFalse(isset($built_content['test_property']), 'Comment content was emptied before being built.');
}
}
@@ -1887,11 +1889,11 @@ class CommentTokenReplaceTestCase extends CommentHelperCase {
$tests['[comment:author:name]'] = check_plain($this->admin_user->name);
// Test to make sure that we generated something for each token.
- $this->assertFalse(in_array(0, array_map('strlen', $tests)), t('No empty tokens generated.'));
+ $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
foreach ($tests as $input => $expected) {
$output = token_replace($input, array('comment' => $comment), array('language' => $language));
- $this->assertEqual($output, $expected, t('Sanitized comment token %token replaced.', array('%token' => $input)));
+ $this->assertEqual($output, $expected, format_string('Sanitized comment token %token replaced.', array('%token' => $input)));
}
// Generate and test unsanitized tokens.
@@ -1907,7 +1909,7 @@ class CommentTokenReplaceTestCase extends CommentHelperCase {
foreach ($tests as $input => $expected) {
$output = token_replace($input, array('comment' => $comment), array('language' => $language, 'sanitize' => FALSE));
- $this->assertEqual($output, $expected, t('Unsanitized comment token %token replaced.', array('%token' => $input)));
+ $this->assertEqual($output, $expected, format_string('Unsanitized comment token %token replaced.', array('%token' => $input)));
}
// Load node so comment_count gets computed.
@@ -1920,7 +1922,7 @@ class CommentTokenReplaceTestCase extends CommentHelperCase {
foreach ($tests as $input => $expected) {
$output = token_replace($input, array('node' => $node), array('language' => $language));
- $this->assertEqual($output, $expected, t('Node comment token %token replaced.', array('%token' => $input)));
+ $this->assertEqual($output, $expected, format_string('Node comment token %token replaced.', array('%token' => $input)));
}
}
}
@@ -1949,25 +1951,25 @@ class CommentActionsTestCase extends CommentHelperCase {
// Unpublish a comment (direct form: doesn't actually save the comment).
comment_unpublish_action($comment);
- $this->assertEqual($comment->status, COMMENT_NOT_PUBLISHED, t('Comment was unpublished'));
- $this->assertWatchdogMessage('Unpublished comment %subject.', array('%subject' => $subject), t('Found watchdog message'));
+ $this->assertEqual($comment->status, COMMENT_NOT_PUBLISHED, 'Comment was unpublished');
+ $this->assertWatchdogMessage('Unpublished comment %subject.', array('%subject' => $subject), 'Found watchdog message');
$this->clearWatchdog();
// Unpublish a comment (indirect form: modify the comment in the database).
comment_unpublish_action(NULL, array('cid' => $comment->cid));
- $this->assertEqual(comment_load($comment->cid)->status, COMMENT_NOT_PUBLISHED, t('Comment was unpublished'));
- $this->assertWatchdogMessage('Unpublished comment %subject.', array('%subject' => $subject), t('Found watchdog message'));
+ $this->assertEqual(comment_load($comment->cid)->status, COMMENT_NOT_PUBLISHED, 'Comment was unpublished');
+ $this->assertWatchdogMessage('Unpublished comment %subject.', array('%subject' => $subject), 'Found watchdog message');
// Publish a comment (direct form: doesn't actually save the comment).
comment_publish_action($comment);
- $this->assertEqual($comment->status, COMMENT_PUBLISHED, t('Comment was published'));
- $this->assertWatchdogMessage('Published comment %subject.', array('%subject' => $subject), t('Found watchdog message'));
+ $this->assertEqual($comment->status, COMMENT_PUBLISHED, 'Comment was published');
+ $this->assertWatchdogMessage('Published comment %subject.', array('%subject' => $subject), 'Found watchdog message');
$this->clearWatchdog();
// Publish a comment (indirect form: modify the comment in the database).
comment_publish_action(NULL, array('cid' => $comment->cid));
- $this->assertEqual(comment_load($comment->cid)->status, COMMENT_PUBLISHED, t('Comment was published'));
- $this->assertWatchdogMessage('Published comment %subject.', array('%subject' => $subject), t('Found watchdog message'));
+ $this->assertEqual(comment_load($comment->cid)->status, COMMENT_PUBLISHED, 'Comment was published');
+ $this->assertWatchdogMessage('Published comment %subject.', array('%subject' => $subject), 'Found watchdog message');
$this->clearWatchdog();
}
@@ -1983,7 +1985,7 @@ class CommentActionsTestCase extends CommentHelperCase {
*/
function assertWatchdogMessage($watchdog_message, $variables, $message) {
$status = (bool) db_query_range("SELECT 1 FROM {watchdog} WHERE message = :message AND variables = :variables", 0, 1, array(':message' => $watchdog_message, ':variables' => serialize($variables)))->fetchField();
- return $this->assert($status, $message);
+ return $this->assert($status, format_string('@message', array('@message' => $message)));
}
/**
@@ -2011,13 +2013,13 @@ class CommentFieldsTest extends CommentHelperCase {
*/
function testCommentDefaultFields() {
// Do not make assumptions on default node types created by the test
- // install profile, and create our own.
+ // installation profile, and create our own.
$this->drupalCreateContentType(array('type' => 'test_node_type'));
// Check that the 'comment_body' field is present on all comment bundles.
$instances = field_info_instances('comment');
foreach (node_type_get_types() as $type_name => $info) {
- $this->assertTrue(isset($instances['comment_node_' . $type_name]['comment_body']), t('The comment_body field is present for comments on type @type', array('@type' => $type_name)));
+ $this->assertTrue(isset($instances['comment_node_' . $type_name]['comment_body']), format_string('The comment_body field is present for comments on type @type', array('@type' => $type_name)));
// Delete the instance along the way.
field_delete_instance($instances['comment_node_' . $type_name]['comment_body']);
@@ -2025,7 +2027,7 @@ class CommentFieldsTest extends CommentHelperCase {
// Check that the 'comment_body' field is deleted.
$field = field_info_field('comment_body');
- $this->assertTrue(empty($field), t('The comment_body field was deleted'));
+ $this->assertTrue(empty($field), 'The comment_body field was deleted');
// Create a new content type.
$type_name = 'test_node_type_2';
@@ -2034,9 +2036,9 @@ class CommentFieldsTest extends CommentHelperCase {
// Check that the 'comment_body' field exists and has an instance on the
// new comment bundle.
$field = field_info_field('comment_body');
- $this->assertTrue($field, t('The comment_body field exists'));
+ $this->assertTrue($field, 'The comment_body field exists');
$instances = field_info_instances('comment');
- $this->assertTrue(isset($instances['comment_node_' . $type_name]['comment_body']), t('The comment_body field is present for comments on type @type', array('@type' => $type_name)));
+ $this->assertTrue(isset($instances['comment_node_' . $type_name]['comment_body']), format_string('The comment_body field is present for comments on type @type', array('@type' => $type_name)));
}
/**
@@ -2052,7 +2054,7 @@ class CommentFieldsTest extends CommentHelperCase {
$edit['modules[Core][comment][enable]'] = FALSE;
$this->drupalPost('admin/modules', $edit, t('Save configuration'));
$this->resetAll();
- $this->assertFalse(module_exists('comment'), t('Comment module disabled.'));
+ $this->assertFalse(module_exists('comment'), 'Comment module disabled.');
// Enable core content type modules (blog, book, and poll).
$edit = array();
@@ -2067,7 +2069,7 @@ class CommentFieldsTest extends CommentHelperCase {
$edit['modules[Core][comment][enable]'] = 'comment';
$this->drupalPost('admin/modules', $edit, t('Save configuration'));
$this->resetAll();
- $this->assertTrue(module_exists('comment'), t('Comment module enabled.'));
+ $this->assertTrue(module_exists('comment'), 'Comment module enabled.');
// Create nodes of each type.
$blog_node = $this->drupalCreateNode(array('type' => 'blog'));
diff --git a/modules/comment/comment.tpl.php b/modules/comment/comment.tpl.php
index a483813d2..829847357 100644
--- a/modules/comment/comment.tpl.php
+++ b/modules/comment/comment.tpl.php
@@ -55,6 +55,8 @@
* @see template_preprocess_comment()
* @see template_process()
* @see theme_comment()
+ *
+ * @ingroup themeable
*/
?>
<div class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>>
diff --git a/modules/dblog/dblog.test b/modules/dblog/dblog.test
index a91356c85..ad01e97f5 100644
--- a/modules/dblog/dblog.test
+++ b/modules/dblog/dblog.test
@@ -256,7 +256,7 @@ class DBLogTestCase extends DrupalWebTestCase {
// View dblog page-not-found report page.
$this->drupalGet('admin/reports/page-not-found');
$this->assertResponse(200);
- // Check that full-length url displayed.
+ // Check that full-length URL displayed.
$this->assertText($not_found_url, t('DBLog event was recorded: [page not found]'));
}
diff --git a/modules/field/field.api.php b/modules/field/field.api.php
index 0d01c59fa..5f641173e 100644
--- a/modules/field/field.api.php
+++ b/modules/field/field.api.php
@@ -690,11 +690,10 @@ function hook_field_is_empty($item, $field) {
* which widget to use. Widget types are defined by implementing
* hook_field_widget_info().
*
- * Widgets are
- * @link http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html Form API @endlink
- * elements with additional processing capabilities. Widget hooks are typically
- * called by the Field Attach API during the creation of the field form
- * structure with field_attach_form().
+ * Widgets are @link forms_api_reference.html Form API @endlink elements with
+ * additional processing capabilities. Widget hooks are typically called by the
+ * Field Attach API during the creation of the field form structure with
+ * field_attach_form().
*
* @see field
* @see field_types
@@ -729,6 +728,9 @@ function hook_field_is_empty($item, $field) {
* - FIELD_BEHAVIOR_DEFAULT: (default) If the widget accepts default
* values.
* - FIELD_BEHAVIOR_NONE: if the widget does not support default values.
+ * - weight: (optional) An integer to determine the weight of this widget
+ * relative to other widgets in the Field UI when selecting a widget for a
+ * given field instance.
*
* @see hook_field_widget_info_alter()
* @see hook_field_widget_form()
@@ -738,7 +740,7 @@ function hook_field_is_empty($item, $field) {
* @see hook_field_widget_settings_form()
*/
function hook_field_widget_info() {
- return array(
+ return array(
'text_textfield' => array(
'label' => t('Text field'),
'field types' => array('text'),
@@ -765,6 +767,8 @@ function hook_field_widget_info() {
'multiple values' => FIELD_BEHAVIOR_DEFAULT,
'default value' => FIELD_BEHAVIOR_DEFAULT,
),
+ // As an advanced widget, force it to sink to the bottom of the choices.
+ 'weight' => 2,
),
);
}
@@ -1072,8 +1076,8 @@ function hook_field_formatter_info() {
* Perform alterations on Field API formatter types.
*
* @param $info
- * Array of informations on formatter types exposed by
- * hook_field_field_formatter_info() implementations.
+ * An array of information on formatter types exposed by
+ * hook_field_formatter_info() implementations.
*/
function hook_field_formatter_info_alter(&$info) {
// Add a setting to a formatter type.
diff --git a/modules/field/field.form.inc b/modules/field/field.form.inc
index 6c27c4329..280f778ff 100644
--- a/modules/field/field.form.inc
+++ b/modules/field/field.form.inc
@@ -6,7 +6,38 @@
*/
/**
- * Create a separate form element for each field.
+ * Creates a form element for a field and can populate it with a default value.
+ *
+ * If the form element is not associated with an entity (i.e., $entity is NULL)
+ * field_get_default_value will be called to supply the default value for the
+ * field. Also allows other modules to alter the form element by implementing
+ * their own hooks.
+ *
+ * @param $entity_type
+ * The type of entity (for example 'node' or 'user') that the field belongs
+ * to.
+ * @param $entity
+ * The entity object that the field belongs to. This may be NULL if creating a
+ * form element with a default value.
+ * @param $field
+ * An array representing the field whose editing element is being created.
+ * @param $instance
+ * An array representing the structure for $field in its current context.
+ * @param $langcode
+ * The language associated with the field.
+ * @param $items
+ * An array of the field values. When creating a new entity this may be NULL
+ * or an empty array to use default values.
+ * @param $form
+ * An array representing the form that the editing element will be attached
+ * to.
+ * @param $form_state
+ * An array containing the current state of the form.
+ * @param $get_delta
+ * Used to get only a specific delta value of a multiple value field.
+ *
+ * @return
+ * The form element array created for this field.
*/
function field_default_form($entity_type, $entity, $field, $instance, $langcode, $items, &$form, &$form_state, $get_delta = NULL) {
// This could be called with no entity, as when a UI module creates a
@@ -278,7 +309,7 @@ function theme_field_multiple_value_form($variables) {
$header = array(
array(
- 'data' => '<label>' . t('!title: !required', array('!title' => $element['#title'], '!required' => $required)) . "</label>",
+ 'data' => '<label>' . t('!title !required', array('!title' => $element['#title'], '!required' => $required)) . "</label>",
'colspan' => 2,
'class' => array('field-label'),
),
diff --git a/modules/field/field.info.inc b/modules/field/field.info.inc
index eb5cc5ca7..9e7ab938d 100644
--- a/modules/field/field.info.inc
+++ b/modules/field/field.info.inc
@@ -54,8 +54,8 @@ function field_info_cache_clear() {
* the field type.
* - 'widget types': Array of hook_field_widget_info() results, keyed by
* widget_type. Each element has the following components: label, field
- * types, settings, and behaviors from hook_field_widget_info(), as well
- * as module, giving the module that exposes the widget type.
+ * types, settings, weight, and behaviors from hook_field_widget_info(),
+ * as well as module, giving the module that exposes the widget type.
* - 'formatter types': Array of hook_field_formatter_info() results, keyed by
* formatter_type. Each element has the following components: label, field
* types, and behaviors from hook_field_formatter_info(), as well as
@@ -124,6 +124,7 @@ function _field_info_collate_types($reset = FALSE) {
}
}
drupal_alter('field_widget_info', $info['widget types']);
+ uasort($info['widget types'], 'drupal_sort_weight');
// Populate formatter types.
foreach (module_implements('field_formatter_info') as $module) {
@@ -702,6 +703,10 @@ function field_info_instances($entity_type = NULL, $bundle_name = NULL) {
* The field name for the instance.
* @param $bundle_name
* The bundle name for the instance.
+ *
+ * @return
+ * An associative array of instance data for the specific field and bundle;
+ * NULL if the instance does not exist.
*/
function field_info_instance($entity_type, $field_name, $bundle_name) {
$info = _field_info_collate_fields();
diff --git a/modules/field/field.install b/modules/field/field.install
index 5934a264c..34d28073d 100644
--- a/modules/field/field.install
+++ b/modules/field/field.install
@@ -172,7 +172,7 @@ function field_schema() {
* This function can be used for databases whose schema is at field module
* version 7000 or higher.
*
- * @ingroup update-api-6.x-to-7.x
+ * @ingroup update_api
*/
function _update_7000_field_create_field(&$field) {
// Merge in default values.`
@@ -253,7 +253,7 @@ function _update_7000_field_create_field(&$field) {
* @param $field_name
* The field name to delete.
*
- * @ingroup update-api-6.x-to-7.x
+ * @ingroup update_api
*/
function _update_7000_field_delete_field($field_name) {
$table_name = 'field_data_' . $field_name;
@@ -284,7 +284,7 @@ function _update_7000_field_delete_field($field_name) {
*
* This function is valid for a database schema version 7000.
*
- * @ingroup update-api-6.x-to-7.x
+ * @ingroup update_api
*/
function _update_7000_field_delete_instance($field_name, $entity_type, $bundle) {
// Delete field instance configuration data.
@@ -322,6 +322,8 @@ function _update_7000_field_delete_instance($field_name, $entity_type, $bundle)
* @return
* An array of fields matching $conditions, keyed by the property specified
* by the $key parameter.
+ *
+ * @ingroup update_api
*/
function _update_7000_field_read_fields(array $conditions = array(), $key = 'id') {
$fields = array();
@@ -356,7 +358,7 @@ function _update_7000_field_read_fields(array $conditions = array(), $key = 'id'
* This function can be used for databases whose schema is at field module
* version 7000 or higher.
*
- * @ingroup update-api-6.x-to-7.x
+ * @ingroup update_api
*/
function _update_7000_field_create_instance($field, &$instance) {
// Merge in defaults.
diff --git a/modules/field/field.module b/modules/field/field.module
index 6fc97a2bf..b6cf05c9b 100644
--- a/modules/field/field.module
+++ b/modules/field/field.module
@@ -376,7 +376,7 @@ function field_system_info_alter(&$info, $file, $type) {
}
if ($non_deleted) {
if (module_exists('field_ui')) {
- $explanation = t('Field type(s) in use - see !link', array('!link' => l(t('Field list'), 'admin/reports/fields')));
+ $explanation = t('Field type(s) in use - see <a href="@fields-page">Field list</a>', array('@fields-page' => url('admin/reports/fields')));
}
else {
$explanation = t('Fields type(s) in use');
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.install b/modules/field/modules/field_sql_storage/field_sql_storage.install
index 78c520fcf..24973ab45 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.install
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.install
@@ -30,7 +30,7 @@ function field_sql_storage_schema() {
* This function can be used for databases whose schema is at field module
* version 7000 or higher.
*
- * @ingroup update-api-6.x-to-7.x
+ * @ingroup update_api
*/
function _update_7000_field_sql_storage_write($entity_type, $bundle, $entity_id, $revision_id, $field_name, $data) {
$table_name = "field_data_{$field_name}";
diff --git a/modules/field/theme/field.tpl.php b/modules/field/theme/field.tpl.php
index a6d7a9659..f0f9d583f 100644
--- a/modules/field/theme/field.tpl.php
+++ b/modules/field/theme/field.tpl.php
@@ -40,6 +40,8 @@
*
* @see template_preprocess_field()
* @see theme_field()
+ *
+ * @ingroup themeable
*/
?>
<!--
diff --git a/modules/file/file.api.php b/modules/file/file.api.php
index 72aae40c9..df178c6f6 100644
--- a/modules/file/file.api.php
+++ b/modules/file/file.api.php
@@ -51,12 +51,6 @@ function hook_file_download_access($file_item, $entity_type, $entity) {
* The type of $entity; for example, 'node' or 'user'.
* @param $entity
* The $entity to which $file is referenced.
- *
- * @return
- * An array of grants, keyed by module name, each with a Boolean grant value.
- * Return an empty array to assert FALSE. You may choose to return your own
- * module's value in addition to other grants or to overwrite the values set
- * by other modules.
*/
function hook_file_download_access_alter(&$grants, $file_item, $entity_type, $entity) {
// For our example module, we always enforce the rules set by node module.
diff --git a/modules/file/file.js b/modules/file/file.js
index 577480bbc..0135a3b27 100644
--- a/modules/file/file.js
+++ b/modules/file/file.js
@@ -73,7 +73,14 @@ Drupal.file = Drupal.file || {
var acceptableMatch = new RegExp('\\.(' + extensionPattern + ')$', 'gi');
if (!acceptableMatch.test(this.value)) {
var error = Drupal.t("The selected file %filename cannot be uploaded. Only files with the following extensions are allowed: %extensions.", {
- '%filename': this.value,
+ // According to the specifications of HTML5, a file upload control
+ // should not reveal the real local path to the file that a user
+ // has selected. Some web browsers implement this restriction by
+ // replacing the local path with "C:\fakepath\", which can cause
+ // confusion by leaving the user thinking perhaps Drupal could not
+ // find the file because it messed up the file path. To avoid this
+ // confusion, therefore, we strip out the bogus fakepath string.
+ '%filename': this.value.replace('C:\\fakepath\\', ''),
'%extensions': extensionPattern.replace(/\|/g, ', ')
});
$(this).closest('div.form-managed-file').prepend('<div class="messages error file-upload-js-error">' + error + '</div>');
diff --git a/modules/forum/forum.module b/modules/forum/forum.module
index 7e8d81bde..fe0ef7920 100644
--- a/modules/forum/forum.module
+++ b/modules/forum/forum.module
@@ -330,10 +330,12 @@ function forum_node_presave($node) {
$langcode = key($node->taxonomy_forums);
if (!empty($node->taxonomy_forums[$langcode])) {
$node->forum_tid = $node->taxonomy_forums[$langcode][0]['tid'];
- $old_tid = db_query_range("SELECT f.tid FROM {forum} f INNER JOIN {node} n ON f.vid = n.vid WHERE n.nid = :nid ORDER BY f.vid DESC", 0, 1, array(':nid' => $node->nid))->fetchField();
- if ($old_tid && isset($node->forum_tid) && ($node->forum_tid != $old_tid) && !empty($node->shadow)) {
- // A shadow copy needs to be created. Retain new term and add old term.
- $node->taxonomy_forums[$langcode][] = array('tid' => $old_tid);
+ if (isset($node->nid)) {
+ $old_tid = db_query_range("SELECT f.tid FROM {forum} f INNER JOIN {node} n ON f.vid = n.vid WHERE n.nid = :nid ORDER BY f.vid DESC", 0, 1, array(':nid' => $node->nid))->fetchField();
+ if ($old_tid && isset($node->forum_tid) && ($node->forum_tid != $old_tid) && !empty($node->shadow)) {
+ // A shadow copy needs to be created. Retain new term and add old term.
+ $node->taxonomy_forums[$langcode][] = array('tid' => $old_tid);
+ }
}
}
}
@@ -1328,7 +1330,7 @@ function _forum_get_topic_order($sortby) {
* The ID of the node to update.
*/
function _forum_update_forum_index($nid) {
- $count = db_query('SELECT COUNT(cid) FROM {comment} WHERE nid = :nid AND status = :status', array(
+ $count = db_query('SELECT COUNT(cid) FROM {comment} c INNER JOIN {forum_index} i ON c.nid = i.nid WHERE c.nid = :nid AND c.status = :status', array(
':nid' => $nid,
':status' => COMMENT_PUBLISHED,
))->fetchField();
diff --git a/modules/forum/forum.test b/modules/forum/forum.test
index d78d962de..6937c623d 100644
--- a/modules/forum/forum.test
+++ b/modules/forum/forum.test
@@ -197,6 +197,14 @@ class ForumTestCase extends DrupalWebTestCase {
$this->drupalGet('forum/' . $this->forum['tid']);
$this->drupalPost("node/$node->nid/edit", array(), t('Save'));
$this->assertResponse(200);
+
+ // Make sure constructing a forum node programmatically produces no notices.
+ $node = new stdClass;
+ $node->type = 'forum';
+ $node->title = 'Test forum notices';
+ $node->uid = 1;
+ $node->taxonomy_forums[LANGUAGE_NONE][0]['tid'] = $this->root_forum['tid'];
+ node_save($node);
}
/**
diff --git a/modules/image/image.field.inc b/modules/image/image.field.inc
index 1be15839c..60c0f5ac0 100644
--- a/modules/image/image.field.inc
+++ b/modules/image/image.field.inc
@@ -600,9 +600,12 @@ function theme_image_formatter($variables) {
$item = $variables['item'];
$image = array(
'path' => $item['uri'],
- 'alt' => $item['alt'],
);
+ if (array_key_exists('alt', $item)) {
+ $image['alt'] = $item['alt'];
+ }
+
if (isset($item['attributes'])) {
$image['attributes'] = $item['attributes'];
}
@@ -613,7 +616,7 @@ function theme_image_formatter($variables) {
}
// Do not output an empty 'title' attribute.
- if (drupal_strlen($item['title']) > 0) {
+ if (isset($item['title']) && drupal_strlen($item['title']) > 0) {
$image['title'] = $item['title'];
}
@@ -625,9 +628,11 @@ function theme_image_formatter($variables) {
$output = theme('image', $image);
}
- if (!empty($variables['path']['path'])) {
+ // The link path and link options are both optional, but for the options to be
+ // processed, the link path must at least be an empty string.
+ if (isset($variables['path']['path'])) {
$path = $variables['path']['path'];
- $options = $variables['path']['options'];
+ $options = isset($variables['path']['options']) ? $variables['path']['options'] : array();
// When displaying an image inside a link, the html option must be TRUE.
$options['html'] = TRUE;
$output = l($output, $path, $options);
diff --git a/modules/image/image.module b/modules/image/image.module
index a9c4d027c..ff50452d5 100644
--- a/modules/image/image.module
+++ b/modules/image/image.module
@@ -34,7 +34,7 @@ define('IMAGE_STORAGE_MODULE', IMAGE_STORAGE_OVERRIDE | IMAGE_STORAGE_DEFAULT);
require_once DRUPAL_ROOT . '/modules/image/image.field.inc';
/**
- * Implement of hook_help().
+ * Implements hook_help().
*/
function image_help($path, $arg) {
switch ($path) {
@@ -1054,7 +1054,7 @@ function image_effect_definitions() {
$effects = &drupal_static(__FUNCTION__);
if (!isset($effects)) {
- if ($cache = cache_get("image_effects:$langcode") && !empty($cache->data)) {
+ if ($cache = cache_get("image_effects:$langcode")) {
$effects = $cache->data;
}
else {
@@ -1262,7 +1262,7 @@ function theme_image_style($variables) {
$variables['width'] = $dimensions['width'];
$variables['height'] = $dimensions['height'];
- // Determine the url for the styled image.
+ // Determine the URL for the styled image.
$variables['path'] = image_style_url($variables['style_name'], $variables['path']);
return theme('image', $variables);
}
diff --git a/modules/image/image.test b/modules/image/image.test
index e4b6d373a..1ca846506 100644
--- a/modules/image/image.test
+++ b/modules/image/image.test
@@ -183,7 +183,7 @@ class ImageStylesPathAndUrlTestCase extends DrupalWebTestCase {
// Create a working copy of the file.
$files = $this->drupalGetTestFiles('image');
- $file = reset($files);
+ $file = array_shift($files);
$image_info = image_get_info($file->uri);
$original_uri = file_unmanaged_copy($file->uri, $scheme . '://', FILE_EXISTS_RENAME);
// Let the image_module_test module know about this file, so it can claim
@@ -212,18 +212,30 @@ class ImageStylesPathAndUrlTestCase extends DrupalWebTestCase {
$this->assertEqual($this->drupalGetHeader('Expires'), 'Sun, 19 Nov 1978 05:00:00 GMT', t('Expires header was sent.'));
$this->assertEqual($this->drupalGetHeader('Cache-Control'), 'no-cache, must-revalidate, post-check=0, pre-check=0', t('Cache-Control header was set to prevent caching.'));
$this->assertEqual($this->drupalGetHeader('X-Image-Owned-By'), 'image_module_test', t('Expected custom header has been added.'));
- // Verify access is denied to private image styles.
- $this->drupalLogout();
+
+ // Make sure that a second request to the already existing derivate works
+ // too.
$this->drupalGet($generate_url);
+ $this->assertResponse(200, t('Image was generated at the URL.'));
+
+ // Repeat this with a different file that we do not have access to and
+ // make sure that access is denied.
+ $file_noaccess = array_shift($files);
+ $original_uri_noaccess = file_unmanaged_copy($file_noaccess->uri, $scheme . '://', FILE_EXISTS_RENAME);
+ $generated_uri_noaccess = $scheme . '://styles/' . $this->style_name . '/' . $scheme . '/'. drupal_basename($original_uri_noaccess);
+ $this->assertFalse(file_exists($generated_uri_noaccess), t('Generated file does not exist.'));
+ $generate_url_noaccess = image_style_url($this->style_name, $original_uri_noaccess);
+
+ $this->drupalGet($generate_url_noaccess);
$this->assertResponse(403, t('Confirmed that access is denied for the private image style.') );
// Verify that images are not appended to the response. Currently this test only uses PNG images.
if (strpos($generate_url, '.png') === FALSE ) {
- $this->fail( t('Confirming that private image styles are not appended require PNG file.') );
+ $this->fail('Confirming that private image styles are not appended require PNG file.');
}
else {
// Check for PNG-Signature (cf. http://www.libpng.org/pub/png/book/chapter08.html#png.ch08.div.2) in the
// response body.
- $this->assertNoRaw( chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10), t('No PNG signature found in the response body.') );
+ $this->assertNoRaw( chr(137) . chr(80) . chr(78) . chr(71) . chr(13) . chr(10) . chr(26) . chr(10), 'No PNG signature found in the response body.');
}
}
}
@@ -243,7 +255,7 @@ class ImageEffectsUnitTest extends ImageToolkitTestCase {
}
function setUp() {
- parent::setUp('image_test');
+ parent::setUp('image_module_test');
module_load_include('inc', 'image', 'image.effects');
}
@@ -330,6 +342,25 @@ class ImageEffectsUnitTest extends ImageToolkitTestCase {
$this->assertEqual($calls['rotate'][0][1], 90, t('Degrees were passed correctly'));
$this->assertEqual($calls['rotate'][0][2], 0xffffff, t('Background color was passed correctly'));
}
+
+ /**
+ * Test image effect caching.
+ */
+ function testImageEffectsCaching() {
+ $image_effect_definitions_called = &drupal_static('image_module_test_image_effect_info_alter');
+
+ // First call should grab a fresh copy of the data.
+ $effects = image_effect_definitions();
+ $this->assertTrue($image_effect_definitions_called === 1, 'image_effect_definitions() generated data.');
+
+ // Second call should come from cache.
+ drupal_static_reset('image_effect_definitions');
+ drupal_static_reset('image_module_test_image_effect_info_alter');
+ $cached_effects = image_effect_definitions();
+ $this->assertTrue(is_null($image_effect_definitions_called), 'image_effect_definitions() returned data from cache.');
+
+ $this->assertTrue($effects == $cached_effects, 'Cached effects are the same as generated effects.');
+ }
}
/**
@@ -717,7 +748,7 @@ class ImageFieldDisplayTestCase extends ImageFieldTestCase {
if ($scheme == 'private') {
// Only verify HTTP headers when using private scheme and the headers are
// sent by Drupal.
- $this->assertEqual($this->drupalGetHeader('Content-Type'), 'image/png; name="' . $test_image->filename . '"', t('Content-Type header was sent.'));
+ $this->assertEqual($this->drupalGetHeader('Content-Type'), 'image/png', t('Content-Type header was sent.'));
$this->assertEqual($this->drupalGetHeader('Content-Disposition'), 'inline; filename="' . $test_image->filename . '"', t('Content-Disposition header was sent.'));
$this->assertEqual($this->drupalGetHeader('Cache-Control'), 'private', t('Cache-Control header was sent.'));
@@ -1566,3 +1597,64 @@ class ImageFieldDefaultImagesTestCase extends ImageFieldTestCase {
}
}
+
+/**
+ * Tests image theme functions.
+ */
+class ImageThemeFunctionWebTestCase extends DrupalWebTestCase {
+
+ public static function getInfo() {
+ return array(
+ 'name' => 'Image theme functions',
+ 'description' => 'Test that the image theme functions work correctly.',
+ 'group' => 'Image',
+ );
+ }
+
+ function setUp() {
+ parent::setUp(array('image'));
+ }
+
+ /**
+ * Tests usage of the image field formatters.
+ */
+ function testImageFormatterTheme() {
+ // Create an image.
+ $files = $this->drupalGetTestFiles('image');
+ $file = reset($files);
+ $original_uri = file_unmanaged_copy($file->uri, 'public://', FILE_EXISTS_RENAME);
+
+ // Create a style.
+ image_style_save(array('name' => 'test'));
+ $url = image_style_url('test', $original_uri);
+
+ // Test using theme_image_formatter() without an image title, alt text, or
+ // link options.
+ $path = $this->randomName();
+ $element = array(
+ '#theme' => 'image_formatter',
+ '#image_style' => 'test',
+ '#item' => array(
+ 'uri' => $original_uri,
+ ),
+ '#path' => array(
+ 'path' => $path,
+ ),
+ );
+ $rendered_element = render($element);
+ $expected_result = '<a href="' . url($path) . '"><img typeof="foaf:Image" src="' . $url . '" alt="" /></a>';
+ $this->assertEqual($expected_result, $rendered_element, 'theme_image_formatter() correctly renders without title, alt, or path options.');
+
+ // Link the image to a fragment on the page, and not a full URL.
+ $fragment = $this->randomName();
+ $element['#path']['path'] = '';
+ $element['#path']['options'] = array(
+ 'external' => TRUE,
+ 'fragment' => $fragment,
+ );
+ $rendered_element = render($element);
+ $expected_result = '<a href="#' . $fragment . '"><img typeof="foaf:Image" src="' . $url . '" alt="" /></a>';
+ $this->assertEqual($expected_result, $rendered_element, 'theme_image_formatter() correctly renders a link fragment.');
+ }
+
+}
diff --git a/modules/image/tests/image_module_test.module b/modules/image/tests/image_module_test.module
index 766a9d957..8a322fb97 100644
--- a/modules/image/tests/image_module_test.module
+++ b/modules/image/tests/image_module_test.module
@@ -9,7 +9,6 @@ function image_module_test_file_download($uri) {
if (variable_get('image_module_test_file_download', FALSE) == $uri) {
return array('X-Image-Owned-By' => 'image_module_test');
}
- return -1;
}
/**
@@ -39,3 +38,13 @@ function image_module_test_image_effect_info() {
function image_module_test_null_effect(array &$image, array $data) {
return TRUE;
}
+
+/**
+ * Implements hook_image_effect_info_alter().
+ *
+ * Used to keep a count of cache misses in image_effect_definitions().
+ */
+function image_module_test_image_effect_info_alter(&$effects) {
+ $image_effects_definition_called = &drupal_static(__FUNCTION__, 0);
+ $image_effects_definition_called++;
+}
diff --git a/modules/locale/locale.install b/modules/locale/locale.install
index 2d94c7170..b4db757f1 100644
--- a/modules/locale/locale.install
+++ b/modules/locale/locale.install
@@ -202,6 +202,19 @@ function locale_update_7004() {
}
/**
+ * Increase {locales_languages}.formula column's length.
+ */
+function locale_update_7005() {
+ db_change_field('languages', 'formula', 'formula', array(
+ 'type' => 'varchar',
+ 'length' => 255,
+ 'not null' => TRUE,
+ 'default' => '',
+ 'description' => 'Plural formula in PHP code to evaluate to get plural indexes.',
+ ));
+}
+
+/**
* @} End of "addtogroup updates-7.x-extra".
*/
@@ -303,7 +316,7 @@ function locale_schema() {
),
'formula' => array(
'type' => 'varchar',
- 'length' => 128,
+ 'length' => 255,
'not null' => TRUE,
'default' => '',
'description' => 'Plural formula in PHP code to evaluate to get plural indexes.',
diff --git a/modules/locale/locale.module b/modules/locale/locale.module
index a20f3d5d7..94e7cd151 100644
--- a/modules/locale/locale.module
+++ b/modules/locale/locale.module
@@ -1033,7 +1033,7 @@ function locale_url_outbound_alter(&$path, &$options, $original_path) {
include_once DRUPAL_ROOT . '/includes/language.inc';
foreach (language_types_configurable() as $type) {
- // Get url rewriter callbacks only from enabled language providers.
+ // Get URL rewriter callbacks only from enabled language providers.
$negotiation = variable_get("language_negotiation_$type", array());
foreach ($negotiation as $id => $provider) {
diff --git a/modules/locale/locale.test b/modules/locale/locale.test
index 6f3135b08..632506e13 100644
--- a/modules/locale/locale.test
+++ b/modules/locale/locale.test
@@ -1958,7 +1958,7 @@ class LocalePathFunctionalTest extends DrupalWebTestCase {
public static function getInfo() {
return array(
'name' => 'Path language settings',
- 'description' => 'Checks you can configure a language for individual url aliases.',
+ 'description' => 'Checks you can configure a language for individual URL aliases.',
'group' => 'Locale',
);
}
@@ -2268,7 +2268,7 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
public static function getInfo() {
return array(
'name' => 'UI language negotiation',
- 'description' => 'Test UI language switching by url path prefix and domain.',
+ 'description' => 'Test UI language switching by URL path prefix and domain.',
'group' => 'Locale',
);
}
@@ -2396,7 +2396,7 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
$this->assertResponse(404, "Unknown language path prefix should return 404");
// Setup for domain negotiation, first configure the language to have domain
- // URL. We use https and a port to make sure that only the domain name is used.
+ // URL. We use HTTPS and a port to make sure that only the domain name is used.
$edit = array('prefix' => '', 'domain' => "https://$language_domain:99");
$this->drupalPost("admin/config/regional/language/edit/$language", $edit, t('Save language'));
// Set the site to use domain language negotiation.
@@ -2513,7 +2513,7 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
$languages = language_list();
foreach (array('it', 'fr') as $langcode) {
- // Build the link we're going to test based on the clean url setting.
+ // Build the link we're going to test based on the clean URL setting.
$link = (!empty($GLOBALS['conf']['clean_url'])) ? $langcode . '.example.com/admin' : $langcode . '.example.com/?q=admin';
// Test URL in another language.
@@ -2524,14 +2524,14 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
$correct_link = $url_scheme . $link;
$this->assertTrue($url == $correct_link, t('The url() function returns the right url (@url) in accordance with the chosen language', array('@url' => $url . " == " . $correct_link)));
- // Test https via options.
+ // Test HTTPS via options.
variable_set('https', TRUE);
$url = url('admin', array('https' => TRUE, 'language' => $languages[$langcode]));
$correct_link = 'https://' . $link;
$this->assertTrue($url == $correct_link, t('The url() function returns the right https url (via options) (@url) in accordance with the chosen language', array('@url' => $url . " == " . $correct_link)));
variable_set('https', FALSE);
- // Test https via current url scheme.
+ // Test HTTPS via current URL scheme.
$temp_https = $is_https;
$is_https = TRUE;
$url = url('admin', array('language' => $languages[$langcode]));
diff --git a/modules/menu/menu.admin.inc b/modules/menu/menu.admin.inc
index 226c3b005..868ddade3 100644
--- a/modules/menu/menu.admin.inc
+++ b/modules/menu/menu.admin.inc
@@ -99,7 +99,14 @@ function _menu_overview_tree_form($tree) {
$mlid = 'mlid:' . $item['mlid'];
$form[$mlid]['#item'] = $item;
$form[$mlid]['#attributes'] = $item['hidden'] ? array('class' => array('menu-disabled')) : array('class' => array('menu-enabled'));
- $form[$mlid]['title']['#markup'] = l($item['title'], $item['href'], $item['localized_options']) . ($item['hidden'] ? ' (' . t('disabled') . ')' : '');
+ $form[$mlid]['title']['#markup'] = l($item['title'], $item['href'], $item['localized_options']);
+ if ($item['hidden']) {
+ $form[$mlid]['title']['#markup'] .= ' (' . t('disabled') . ')';
+ }
+ elseif ($item['link_path'] == 'user' && $item['module'] == 'system') {
+ $form[$mlid]['title']['#markup'] .= ' (' . t('logged in users only') . ')';
+ }
+
$form[$mlid]['hidden'] = array(
'#type' => 'checkbox',
'#title' => t('Enable @title menu link', array('@title' => $item['title'])),
diff --git a/modules/node/node.api.php b/modules/node/node.api.php
index 6d14a0737..052effc9b 100644
--- a/modules/node/node.api.php
+++ b/modules/node/node.api.php
@@ -498,9 +498,18 @@ function hook_node_revision_delete($node) {
/**
* Respond to creation of a new node.
*
- * This hook is invoked from node_save() after the node is inserted into the
- * node table in the database, after the type-specific hook_insert() is invoked,
- * and after field_attach_insert() is called.
+ * This hook is invoked from node_save() after the database query that will
+ * insert the node into the node table is scheduled for execution, after the
+ * type-specific hook_insert() is invoked, and after field_attach_insert() is
+ * called.
+ *
+ * Note that when this hook is invoked, the changes have not yet been written to
+ * the database, because a database transaction is still in progress. The
+ * transaction is not finalized until the save operation is entirely completed
+ * and node_save() goes out of scope. You should not rely on data in the
+ * database at this time as it is not updated yet. You should also note that any
+ * write/update database queries executed from this hook are also not committed
+ * immediately. Check node_save() and db_transaction() for more info.
*
* @param $node
* The node that is being created.
@@ -517,40 +526,43 @@ function hook_node_insert($node) {
}
/**
- * Act on nodes being loaded from the database.
+ * Act on arbitrary nodes being loaded from the database.
+ *
+ * This hook should be used to add information that is not in the node or
+ * node revisions table, not to replace information that is in these tables
+ * (which could interfere with the entity cache). For performance reasons,
+ * information for all available nodes should be loaded in a single query where
+ * possible.
*
* This hook is invoked during node loading, which is handled by entity_load(),
* via classes NodeController and DrupalDefaultEntityController. After the node
* information is read from the database or the entity cache, hook_load() is
- * invoked on the node's content type module, then field_attach_node_revision()
+ * invoked on the node's content type module, then field_attach_load_revision()
* or field_attach_load() is called, then hook_entity_load() is invoked on all
* implementing modules, and finally hook_node_load() is invoked on all
* implementing modules.
*
- * This hook should only be used to add information that is not in the node or
- * node revisions table, not to replace information that is in these tables
- * (which could interfere with the entity cache). For performance reasons,
- * information for all available nodes should be loaded in a single query where
- * possible.
- *
- * The $types parameter allows for your module to have an early return (for
- * efficiency) if your module only supports certain node types. However, if your
- * module defines a content type, you can use hook_load() to respond to loading
- * of just that content type.
- *
* @param $nodes
* An array of the nodes being loaded, keyed by nid.
* @param $types
- * An array containing the types of the nodes.
+ * An array containing the node types present in $nodes. Allows for an early
+ * return for modules that only support certain node types. However, if your
+ * module defines a content type, you can use hook_load() to respond to
+ * loading of just that content type.
*
* For a detailed usage example, see nodeapi_example.module.
*
* @ingroup node_api_hooks
*/
function hook_node_load($nodes, $types) {
- $result = db_query('SELECT nid, foo FROM {mytable} WHERE nid IN(:nids)', array(':nids' => array_keys($nodes)));
- foreach ($result as $record) {
- $nodes[$record->nid]->foo = $record->foo;
+ // Decide whether any of $types are relevant to our purposes.
+ if (count(array_intersect($types_we_want_to_process, $types))) {
+ // Gather our extra data for each of these nodes.
+ $result = db_query('SELECT nid, foo FROM {mytable} WHERE nid IN(:nids)', array(':nids' => array_keys($nodes)));
+ // Add our extra data to the node objects.
+ foreach ($result as $record) {
+ $nodes[$record->nid]->foo = $record->foo;
+ }
}
}
@@ -684,9 +696,18 @@ function hook_node_presave($node) {
/**
* Respond to updates to a node.
*
- * This hook is invoked from node_save() after the node is updated in the node
- * table in the database, after the type-specific hook_update() is invoked, and
- * after field_attach_update() is called.
+ * This hook is invoked from node_save() after the database query that will
+ * update node in the node table is scheduled for execution, after the
+ * type-specific hook_update() is invoked, and after field_attach_update() is
+ * called.
+ *
+ * Note that when this hook is invoked, the changes have not yet been written to
+ * the database, because a database transaction is still in progress. The
+ * transaction is not finalized until the save operation is entirely completed
+ * and node_save() goes out of scope. You should not rely on data in the
+ * database at this time as it is not updated yet. You should also note that any
+ * write/update database queries executed from this hook are also not committed
+ * immediately. Check node_save() and db_transaction() for more info.
*
* @param $node
* The node that is being updated.
diff --git a/modules/node/node.install b/modules/node/node.install
index 434410c8d..16d3dbaa0 100644
--- a/modules/node/node.install
+++ b/modules/node/node.install
@@ -474,7 +474,7 @@ function node_update_dependencies() {
*
* This function is valid for a database schema version 7000.
*
- * @ingroup update-api-6.x-to-7.x
+ * @ingroup update_api
*/
function _update_7000_node_get_types() {
$node_types = db_query('SELECT * FROM {node_type}')->fetchAllAssoc('type', PDO::FETCH_OBJ);
diff --git a/modules/node/node.module b/modules/node/node.module
index 264816c00..f181b52bb 100644
--- a/modules/node/node.module
+++ b/modules/node/node.module
@@ -243,7 +243,7 @@ function node_field_display_node_alter(&$display, $context) {
}
/**
- * Entity uri callback.
+ * Entity URI callback.
*/
function node_uri($node) {
return array(
@@ -1345,6 +1345,14 @@ function node_build_content($node, $view_mode = 'full', $langcode = NULL) {
// Remove previously built content, if exists.
$node->content = array();
+ // Allow modules to change the view mode.
+ $context = array(
+ 'entity_type' => 'node',
+ 'entity' => $node,
+ 'langcode' => $langcode,
+ );
+ drupal_alter('entity_view_mode', $view_mode, $context);
+
// The 'view' hook can be implemented to overwrite the default function
// to display nodes.
if (node_hook($node, 'view')) {
@@ -1984,6 +1992,9 @@ function node_menu() {
'page callback' => 'node_feed',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
+ // Pass a FALSE and array argument to ensure that additional path components
+ // are not passed to node_feed().
+ 'page arguments' => array(FALSE, array()),
);
// @todo Remove this loop when we have a 'description callback' property.
// Reset internal static cache of _node_types_build(), forces to rebuild the
@@ -2578,10 +2589,10 @@ function node_view_multiple($nodes, $view_mode = 'teaser', $weight = 0, $langcod
function node_page_default() {
$select = db_select('node', 'n')
->fields('n', array('nid', 'sticky', 'created'))
- ->condition('promote', 1)
- ->condition('status', 1)
- ->orderBy('sticky', 'DESC')
- ->orderBy('created', 'DESC')
+ ->condition('n.promote', 1)
+ ->condition('n.status', 1)
+ ->orderBy('n.sticky', 'DESC')
+ ->orderBy('n.created', 'DESC')
->extend('PagerDefault')
->limit(variable_get('default_nodes_main', 10))
->addTag('node_access');
@@ -2764,7 +2775,7 @@ function node_search_validate($form, &$form_state) {
// Insert extra restrictions into the search keywords string.
if (isset($form_state['values']['type']) && is_array($form_state['values']['type'])) {
- // Retrieve selected types - Forms API sets the value of unselected
+ // Retrieve selected types - Form API sets the value of unselected
// checkboxes to 0.
$form_state['values']['type'] = array_filter($form_state['values']['type']);
if (count($form_state['values']['type'])) {
@@ -3891,24 +3902,25 @@ function node_unpublish_by_keyword_action($node, $context) {
*/
function node_requirements($phase) {
$requirements = array();
- // Ensure translations don't break at install time
- $t = get_t();
- // Only show rebuild button if there are either 0, or 2 or more, rows
- // in the {node_access} table, or if there are modules that
- // implement hook_node_grants().
- $grant_count = db_query('SELECT COUNT(*) FROM {node_access}')->fetchField();
- if ($grant_count != 1 || count(module_implements('node_grants')) > 0) {
- $value = format_plural($grant_count, 'One permission in use', '@count permissions in use', array('@count' => $grant_count));
- } else {
- $value = $t('Disabled');
- }
- $description = $t('If the site is experiencing problems with permissions to content, you may have to rebuild the permissions cache. Rebuilding will remove all privileges to content and replace them with permissions based on the current modules and settings. Rebuilding may take some time if there is a lot of content or complex permission settings. After rebuilding has completed, content will automatically use the new permissions.');
-
- $requirements['node_access'] = array(
- 'title' => $t('Node Access Permissions'),
- 'value' => $value,
- 'description' => $description . ' ' . l(t('Rebuild permissions'), 'admin/reports/status/rebuild'),
- );
+ if ($phase === 'runtime') {
+ // Only show rebuild button if there are either 0, or 2 or more, rows
+ // in the {node_access} table, or if there are modules that
+ // implement hook_node_grants().
+ $grant_count = db_query('SELECT COUNT(*) FROM {node_access}')->fetchField();
+ if ($grant_count != 1 || count(module_implements('node_grants')) > 0) {
+ $value = format_plural($grant_count, 'One permission in use', '@count permissions in use', array('@count' => $grant_count));
+ }
+ else {
+ $value = t('Disabled');
+ }
+ $description = t('If the site is experiencing problems with permissions to content, you may have to rebuild the permissions cache. Rebuilding will remove all privileges to content and replace them with permissions based on the current modules and settings. Rebuilding may take some time if there is a lot of content or complex permission settings. After rebuilding has completed, content will automatically use the new permissions.');
+
+ $requirements['node_access'] = array(
+ 'title' => t('Node Access Permissions'),
+ 'value' => $value,
+ 'description' => $description . ' ' . l(t('Rebuild permissions'), 'admin/reports/status/rebuild'),
+ );
+ }
return $requirements;
}
diff --git a/modules/node/node.test b/modules/node/node.test
index 37d05e529..9ef4c2586 100644
--- a/modules/node/node.test
+++ b/modules/node/node.test
@@ -832,7 +832,11 @@ class NodeRSSContentTestCase extends DrupalWebTestCase {
// viewing node.
$this->drupalGet("node/$node->nid");
$this->assertNoText($rss_only_content, t('Node content designed for RSS doesn\'t appear when viewing node.'));
-
+
+ // Check that the node feed page does not try to interpret additional path
+ // components as arguments for node_feed() and returns default content.
+ $this->drupalGet('rss.xml/' . $this->randomName() . '/' . $this->randomName());
+ $this->assertText($rss_only_content, t('Ignore page arguments when delivering rss.xml.'));
}
}
@@ -2030,9 +2034,9 @@ class NodeQueryAlter extends DrupalWebTestCase {
// Create user with simple node access permission. The 'node test view'
// permission is implemented and granted by the node_access_test module.
- $this->accessUser = $this->drupalCreateUser(array('access content', 'node test view'));
- $this->noAccessUser = $this->drupalCreateUser(array('access content'));
- $this->noAccessUser2 = $this->drupalCreateUser(array('access content'));
+ $this->accessUser = $this->drupalCreateUser(array('access content overview', 'access content', 'node test view'));
+ $this->noAccessUser = $this->drupalCreateUser(array('access content overview', 'access content'));
+ $this->noAccessUser2 = $this->drupalCreateUser(array('access content overview', 'access content'));
}
/**
@@ -2045,11 +2049,19 @@ class NodeQueryAlter extends DrupalWebTestCase {
$this->assertText('Yes, 4 nodes', "4 nodes were found for access user");
$this->assertNoText('Exception', "No database exception");
+ // Test the content overview page.
+ $this->drupalGet('admin/content');
+ $table_rows = $this->xpath('//tbody/tr');
+ $this->assertEqual(4, count($table_rows), "4 nodes were found for access user");
+
// Verify that a user with no access permission cannot see nodes.
$this->drupalLogin($this->noAccessUser);
$this->drupalGet('node_access_test_page');
$this->assertText('No nodes', "No nodes were found for no access user");
$this->assertNoText('Exception', "No database exception");
+
+ $this->drupalGet('admin/content');
+ $this->assertText(t('No content available.'));
}
/**
@@ -2474,24 +2486,24 @@ class NodeAccessPagerTestCase extends DrupalWebTestCase {
// View the node page. With the default 50 comments per page there should
// be two pages (0, 1) but no third (2) page.
$this->drupalGet('node/' . $node->nid);
- $this->assertText($node->title, t('Node title found.'));
- $this->assertText(t('Comments'), t('Has a comments section.'));
- $this->assertRaw('page=1', t('Secound page exists.'));
- $this->assertNoRaw('page=2', t('No third page exists.'));
+ $this->assertText($node->title);
+ $this->assertText(t('Comments'));
+ $this->assertRaw('page=1');
+ $this->assertNoRaw('page=2');
}
/**
* Tests the forum node pager for nodes with multiple grants per realm.
*/
public function testForumPager() {
- // Lookup the forums vocabulary vid.
+ // Look up the forums vocabulary ID.
$vid = variable_get('forum_nav_vocabulary', 0);
- $this->assertTrue($vid, t('Forum navigation vocabulary found.'));
+ $this->assertTrue($vid, 'Forum navigation vocabulary ID is set.');
- // Lookup the general discussion term.
+ // Look up the general discussion term.
$tree = taxonomy_get_tree($vid, 0, 1);
$tid = reset($tree)->tid;
- $this->assertTrue($tid, t('General discussion term found.'));
+ $this->assertTrue($tid, 'General discussion term is found in the forum vocabulary.');
// Create 30 nodes.
for ($i = 0; $i < 30; $i++) {
@@ -2510,8 +2522,8 @@ class NodeAccessPagerTestCase extends DrupalWebTestCase {
// page there should be two pages for 30 nodes, no more.
$this->drupalLogin($this->web_user);
$this->drupalGet('forum/' . $tid);
- $this->assertRaw('page=1', t('Secound page exists.'));
- $this->assertNoRaw('page=2', t('No third page exists.'));
+ $this->assertRaw('page=1');
+ $this->assertNoRaw('page=2');
}
}
@@ -2589,3 +2601,48 @@ class NodeAccessFieldTestCase extends NodeWebTestCase {
$this->assertRaw($default, 'The updated default value is displayed when creating a new node.');
}
}
+
+/**
+ * Tests changing view modes for nodes.
+ */
+class NodeEntityViewModeAlterTest extends NodeWebTestCase {
+
+ public static function getInfo() {
+ return array(
+ 'name' => 'Node entity view mode',
+ 'description' => 'Test changing view mode.',
+ 'group' => 'Node'
+ );
+ }
+
+ function setUp() {
+ parent::setUp(array('node_test'));
+ }
+
+ /**
+ * Create a "Basic page" node and verify its consistency in the database.
+ */
+ function testNodeViewModeChange() {
+ $web_user = $this->drupalCreateUser(array('create page content', 'edit own page content'));
+ $this->drupalLogin($web_user);
+
+ // Create a node.
+ $edit = array();
+ $langcode = LANGUAGE_NONE;
+ $edit["title"] = $this->randomName(8);
+ $edit["body[$langcode][0][value]"] = t('Data that should appear only in the body for the node.');
+ $edit["body[$langcode][0][summary]"] = t('Extra data that should appear only in the teaser for the node.');
+ $this->drupalPost('node/add/page', $edit, t('Save'));
+
+ $node = $this->drupalGetNodeByTitle($edit["title"]);
+
+ // Set the flag to alter the view mode and view the node.
+ variable_set('node_test_change_view_mode', 'teaser');
+ $this->drupalGet('node/' . $node->nid);
+
+ // Check that teaser mode is viewed.
+ $this->assertText('Extra data that should appear only in the teaser for the node.', 'Teaser text present');
+ // Make sure body text is not present.
+ $this->assertNoText('Data that should appear only in the body for the node.', 'Body text not present');
+ }
+}
diff --git a/modules/node/node.tpl.php b/modules/node/node.tpl.php
index 6d0f489d7..4c358a16d 100644
--- a/modules/node/node.tpl.php
+++ b/modules/node/node.tpl.php
@@ -14,7 +14,7 @@
* - $date: Formatted creation date. Preprocess functions can reformat it by
* calling format_date() with the desired parameters on the $created variable.
* - $name: Themed username of node author output from theme_username().
- * - $node_url: Direct url of the current node.
+ * - $node_url: Direct URL of the current node.
* - $display_submitted: Whether submission information should be displayed.
* - $submitted: Submission information created from $name and $date during
* template_preprocess_node().
@@ -22,7 +22,7 @@
* CSS. It can be manipulated through the variable $classes_array from
* preprocess functions. The default values can be one or more of the
* following:
- * - node: The current template type, i.e., "theming hook".
+ * - node: The current template type; for example, "theming hook".
* - node-[type]: The current node type. For example, if the node is a
* "Blog entry" it would result in "node-blog". Note that the machine
* name will often be in a short form of the human readable label.
@@ -42,7 +42,7 @@
*
* Other variables:
* - $node: Full node object. Contains data that may not be safe.
- * - $type: Node type, i.e. story, page, blog, etc.
+ * - $type: Node type; for example, story, page, blog, etc.
* - $comment_count: Number of comments attached to the node.
* - $uid: User ID of the node author.
* - $created: Time the node was published formatted in Unix timestamp.
@@ -53,7 +53,7 @@
* - $id: Position of the node. Increments each time it's output.
*
* Node status variables:
- * - $view_mode: View mode, e.g. 'full', 'teaser'...
+ * - $view_mode: View mode; for example, "full", "teaser".
* - $teaser: Flag for the teaser state (shortcut for $view_mode == 'teaser').
* - $page: Flag for the full page state.
* - $promote: Flag for front page promotion state.
@@ -67,15 +67,17 @@
* - $is_admin: Flags true when the current user is an administrator.
*
* Field variables: for each field instance attached to the node a corresponding
- * variable is defined, e.g. $node->body becomes $body. When needing to access
- * a field's raw values, developers/themers are strongly encouraged to use these
- * variables. Otherwise they will have to explicitly specify the desired field
- * language, e.g. $node->body['en'], thus overriding any language negotiation
- * rule that was previously applied.
+ * variable is defined; for example, $node->body becomes $body. When needing to
+ * access a field's raw values, developers/themers are strongly encouraged to
+ * use these variables. Otherwise they will have to explicitly specify the
+ * desired field language; for example, $node->body['en'], thus overriding any
+ * language negotiation rule that was previously applied.
*
* @see template_preprocess()
* @see template_preprocess_node()
* @see template_process()
+ *
+ * @ingroup themeable
*/
?>
<div id="node-<?php print $node->nid; ?>" class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>>
diff --git a/modules/node/tests/node_test.module b/modules/node/tests/node_test.module
index b0ebc149a..a52c1fad0 100644
--- a/modules/node/tests/node_test.module
+++ b/modules/node/tests/node_test.module
@@ -149,3 +149,13 @@ function node_test_node_update($node) {
}
}
}
+
+/**
+ * Implements hook_entity_view_mode_alter().
+ */
+function node_test_entity_view_mode_alter(&$view_mode, $context) {
+ // Only alter the view mode if we are on the test callback.
+ if ($change_view_mode = variable_get('node_test_change_view_mode', '')) {
+ $view_mode = $change_view_mode;
+ }
+}
diff --git a/modules/openid/openid.inc b/modules/openid/openid.inc
index 3c8281540..74a08d576 100644
--- a/modules/openid/openid.inc
+++ b/modules/openid/openid.inc
@@ -858,7 +858,7 @@ function _openid_invalid_openid_transition($identity, $response) {
$fallback_account = user_external_load($fallback_identity);
}
- // Try to replace https with http. OpenID providers often redirect
+ // Try to replace HTTPS with HTTP. OpenID providers often redirect
// from http to https, but Drupal didn't follow the redirect.
if (!$fallback_account && strpos($fallback_identity, 'https://') !== FALSE) {
$fallback_identity = str_replace('https://', 'http://', $fallback_identity);
diff --git a/modules/openid/openid.module b/modules/openid/openid.module
index 6cfdad95a..a3f4fc8e0 100644
--- a/modules/openid/openid.module
+++ b/modules/openid/openid.module
@@ -428,7 +428,7 @@ function openid_discovery($claimed_id) {
}
/**
- * Implementation of hook_openid_discovery_method_info().
+ * Implements hook_openid_discovery_method_info().
*
* Define standard discovery methods.
*/
@@ -566,7 +566,7 @@ function _openid_xrds_discovery($claimed_id) {
}
/**
- * Implementation of hook_openid_normalization_method_info().
+ * Implements hook_openid_normalization_method_info().
*
* Define standard normalization methods.
*/
@@ -1010,7 +1010,7 @@ function openid_verify_assertion_return_url($service, $response) {
/**
* Remove expired nonces from the database.
*
- * Implementation of hook_cron().
+ * Implements hook_cron().
*/
function openid_cron() {
db_delete('openid_nonce')
diff --git a/modules/openid/openid.pages.inc b/modules/openid/openid.pages.inc
index 6e3f096e4..8a52f2040 100644
--- a/modules/openid/openid.pages.inc
+++ b/modules/openid/openid.pages.inc
@@ -56,6 +56,7 @@ function openid_user_identities($account) {
'#theme' => 'table',
'#header' => $header,
'#rows' => $rows,
+ '#empty' => t('No OpenID identities available for this account.'),
);
$build['openid_user_add'] = drupal_get_form('openid_user_add');
return $build;
diff --git a/modules/openid/openid.test b/modules/openid/openid.test
index 1f03c135d..bd871a863 100644
--- a/modules/openid/openid.test
+++ b/modules/openid/openid.test
@@ -78,13 +78,13 @@ class OpenIDFunctionalTestCase extends OpenIDWebTestCase {
// the URL of the OpenID Provider Endpoint.
// Identifier is the URL of an XRDS document.
- // The URL scheme is stripped in order to test that the supplied identifier
- // is normalized in openid_begin().
+ // On HTTP test environments, the URL scheme is stripped in order to test
+ // that the supplied identifier is normalized in openid_begin().
$identity = url('openid-test/yadis/xrds', array('absolute' => TRUE));
- $this->addIdentity(preg_replace('@^https?://@', '', $identity), 2, 'http://example.com/xrds', $identity);
+ $this->addIdentity(preg_replace('@^http://@', '', $identity), 2, 'http://example.com/xrds', $identity);
$identity = url('openid-test/yadis/xrds/delegate', array('absolute' => TRUE));
- $this->addIdentity(preg_replace('@^https?://@', '', $identity), 2, 'http://example.com/xrds-delegate', $identity);
+ $this->addIdentity(preg_replace('@^http://@', '', $identity), 2, 'http://example.com/xrds-delegate', $identity);
// Identifier is the URL of an XRDS document containing an OP Identifier
// Element. The Relying Party sends the special value
@@ -92,8 +92,8 @@ class OpenIDFunctionalTestCase extends OpenIDWebTestCase {
// Identifier. The OpenID Provider responds with the actual identifier
// including the fragment.
$identity = url('openid-test/yadis/xrds/dummy-user', array('absolute' => TRUE, 'fragment' => $this->randomName()));
- // Tell openid_test.module to respond with this identifier. We test if
- // openid_complete() processes it right.
+ // Tell openid_test.module to respond with this identifier. If the fragment
+ // part is present in the identifier, it should be retained.
variable_set('openid_test_response', array('openid.claimed_id' => $identity));
$this->addIdentity(url('openid-test/yadis/xrds/server', array('absolute' => TRUE)), 2, 'http://specs.openid.net/auth/2.0/identifier_select', $identity);
variable_set('openid_test_response', array());
diff --git a/modules/overlay/overlay-child-rtl.css b/modules/overlay/overlay-child-rtl.css
index 7fd39f440..2e5a267c4 100644
--- a/modules/overlay/overlay-child-rtl.css
+++ b/modules/overlay/overlay-child-rtl.css
@@ -1,4 +1,9 @@
+/**
+ * @file
+ * RTL styling for Overlay child pages.
+ */
+
html {
direction: rtl;
}
diff --git a/modules/overlay/overlay-child.css b/modules/overlay/overlay-child.css
index a2b23b462..959ebddbd 100644
--- a/modules/overlay/overlay-child.css
+++ b/modules/overlay/overlay-child.css
@@ -1,4 +1,9 @@
+/**
+ * @file
+ * Basic styling for the Overlay child pages.
+ */
+
html.js {
background: transparent !important;
overflow-y: scroll;
diff --git a/modules/overlay/overlay-child.js b/modules/overlay/overlay-child.js
index e78e3831c..4ff6cf0c8 100644
--- a/modules/overlay/overlay-child.js
+++ b/modules/overlay/overlay-child.js
@@ -1,3 +1,7 @@
+/**
+ * @file
+ * Attaches the behaviors for the Overlay child pages.
+ */
(function ($) {
diff --git a/modules/overlay/overlay-parent.css b/modules/overlay/overlay-parent.css
index dad6d5575..9459a7af3 100644
--- a/modules/overlay/overlay-parent.css
+++ b/modules/overlay/overlay-parent.css
@@ -1,4 +1,9 @@
+/**
+ * @file
+ * Basic styling for the Overlay module.
+ */
+
html.overlay-open,
html.overlay-open body {
height: 100%;
diff --git a/modules/overlay/overlay-parent.js b/modules/overlay/overlay-parent.js
index ace7deff7..521bd7689 100644
--- a/modules/overlay/overlay-parent.js
+++ b/modules/overlay/overlay-parent.js
@@ -1,3 +1,8 @@
+/**
+ * @file
+ * Attaches the behaviors for the Overlay parent pages.
+ */
+
(function ($) {
/**
@@ -339,7 +344,7 @@ Drupal.overlay.setFocusBefore = function ($element, document) {
* Check if the given link is in the administrative section of the site.
*
* @param url
- * The url to be tested.
+ * The URL to be tested.
*
* @return boolean
* TRUE if the URL represents an administrative link, FALSE otherwise.
@@ -374,7 +379,7 @@ Drupal.overlay.isAdminLink = function (url) {
* Determine whether a link is external to the site.
*
* @param url
- * The url to be tested.
+ * The URL to be tested.
*
* @return boolean
* TRUE if the URL is external to the site, FALSE otherwise.
@@ -560,7 +565,7 @@ Drupal.overlay.eventhandlerOverrideLink = function (event) {
var target = $target[0];
var href = target.href;
- // Only handle links that have an href attribute and use the http(s) protocol.
+ // Only handle links that have an href attribute and use the HTTP(S) protocol.
if (href != undefined && href != '' && target.protocol.match(/^https?\:/)) {
var anchor = href.replace(target.ownerDocument.location.href, '');
// Skip anchor links.
diff --git a/modules/overlay/overlay.install b/modules/overlay/overlay.install
index 2fa7c84bc..2df860b5e 100644
--- a/modules/overlay/overlay.install
+++ b/modules/overlay/overlay.install
@@ -2,14 +2,14 @@
/**
* @file
- * Install, update and uninstall functions for the overlay module.
+ * Install, update, and uninstall functions for the Overlay module.
*/
/**
* Implements hook_enable().
*
* If the module is being enabled through the admin UI, and not from an
- * install profile, reopen the modules page in an overlay.
+ * installation profile, reopen the modules page in an overlay.
*/
function overlay_enable() {
if (strpos(current_path(), 'admin/modules') === 0) {
diff --git a/modules/overlay/overlay.module b/modules/overlay/overlay.module
index 6acc2603d..c07cc6cfa 100644
--- a/modules/overlay/overlay.module
+++ b/modules/overlay/overlay.module
@@ -302,7 +302,10 @@ function overlay_page_alter(&$page) {
}
/**
- * Menu callback; dismisses the overlay accessibility message for this user.
+ * Page callback: Dismisses the overlay accessibility message for this user.
+ *
+ * @return
+ * A render array for a page containing a list of content.
*/
function overlay_user_dismiss_message() {
global $user;
@@ -327,10 +330,12 @@ function overlay_user_dismiss_message() {
* If the current user can access the overlay and has not previously indicated
* that this message should be dismissed, this function returns a message
* containing a link to disable the overlay. Nothing is returned for anonymous
- * users, because the links control per-user settings. Therefore, because some
- * screen readers are unable to properly read overlay contents, site builders
- * are discouraged from granting the "access overlay" permission to the
- * anonymous role. See http://drupal.org/node/890284.
+ * users, because the links control per-user settings. Because some screen
+ * readers are unable to properly read overlay contents, site builders are
+ * discouraged from granting the "access overlay" permission to the anonymous
+ * role.
+ *
+ * @see http://drupal.org/node/890284
*/
function overlay_disable_message() {
global $user;
@@ -385,7 +390,13 @@ function overlay_disable_message() {
/**
* Returns the HTML for the message about how to disable the overlay.
*
- * @see overlay_disable_message()
+ * @param $variables
+ * An associative array with an 'element' element, which itself is an
+ * associative array containing:
+ * - profile_link: The link to this user's account.
+ * - dismiss_message_link: The link to dismiss the overlay.
+ *
+ * @ingroup themeable
*/
function theme_overlay_disable_message($variables) {
$element = $variables['element'];
@@ -473,8 +484,12 @@ function overlay_preprocess_maintenance_page(&$variables) {
}
/**
- * Preprocesses template variables for overlay.tpl.php
+ * Implements template_preprocess_HOOK() for overlay.tpl.php
*
+ * If the current page request is inside the overlay, add appropriate classes
+ * to the <body> element, and simplify the page title.
+ *
+ * @see template_process_overlay()
* @see overlay.tpl.php
*/
function template_preprocess_overlay(&$variables) {
@@ -485,20 +500,21 @@ function template_preprocess_overlay(&$variables) {
}
/**
- * Processes variables for overlay.tpl.php
+ * Implements template_process_HOOK() for overlay.tpl.php
+ *
+ * Places the rendered HTML for the page body into a top level variable.
*
* @see template_preprocess_overlay()
* @see overlay.tpl.php
*/
function template_process_overlay(&$variables) {
- // Place the rendered HTML for the page body into a top level variable.
$variables['page'] = $variables['page']['#children'];
}
/**
* Implements hook_preprocess_page().
*
- * Hide tabs inside the overlay.
+ * If the current page request is inside the overlay, hide the tabs.
*
* @see overlay_get_mode()
*/
@@ -509,7 +525,7 @@ function overlay_preprocess_page(&$variables) {
}
/**
- * Callback to request that the overlay display an empty page.
+ * Stores and returns whether an empty page override is needed.
*
* This is used to prevent a page request which closes the overlay (for
* example, a form submission) from being fully re-rendered before the overlay
@@ -550,7 +566,7 @@ function overlay_page_delivery_callback_alter(&$callback) {
}
/**
- * Delivery callback to display an empty page.
+ * Prints an empty page.
*
* This function is used to print out a bare minimum empty page which still has
* the scripts and styles necessary in order to trigger the overlay to close.
@@ -562,7 +578,7 @@ function overlay_deliver_empty_page() {
}
/**
- * Get the current overlay mode.
+ * Gets the current overlay mode.
*
* @see overlay_set_mode()
*/
@@ -688,12 +704,13 @@ function overlay_overlay_child_initialize() {
}
/**
- * Callback to request that the overlay close as soon as the page is displayed.
+ * Requests that the overlay overlay closes when the page is displayed.
*
* @param $redirect
* (optional) The path that should open in the parent window after the
* overlay closes. If not set, no redirect will be performed on the parent
* window.
+ *
* @param $redirect_options
* (optional) An associative array of options to use when generating the
* redirect URL.
@@ -757,7 +774,7 @@ function overlay_supplemental_regions() {
}
/**
- * Helper function for returning a list of page regions related to the overlay.
+ * Returns a list of page regions related to the overlay.
*
* @param $type
* The type of regions to return. This can either be 'overlay_regions' or
@@ -923,7 +940,7 @@ function overlay_store_rendered_content($id = NULL, $content = NULL) {
}
/**
- * Request that the parent window refresh a particular page region.
+ * Requests that the parent window refreshes a particular page region.
*
* @param $region
* The name of the page region to refresh. The parent window will trigger a
@@ -938,7 +955,7 @@ function overlay_request_refresh($region) {
}
/**
- * Request that the entire parent window be reloaded when the overlay closes.
+ * Requests that the entire parent window is reloaded when the overlay closes.
*
* @see overlay_trigger_refresh()
*/
@@ -947,7 +964,7 @@ function overlay_request_page_refresh() {
}
/**
- * Check if the parent window needs to be refreshed on this page load.
+ * Checks if the parent window needs to be refreshed on this page load.
*
* If the previous page load requested that any page regions be refreshed, or
* if it requested that the entire page be refreshed when the overlay closes,
diff --git a/modules/overlay/overlay.tpl.php b/modules/overlay/overlay.tpl.php
index 54b10af1f..df8633752 100644
--- a/modules/overlay/overlay.tpl.php
+++ b/modules/overlay/overlay.tpl.php
@@ -17,6 +17,8 @@
* @see template_preprocess()
* @see template_preprocess_overlay()
* @see template_process()
+ *
+ * @ingroup themeable
*/
?>
diff --git a/modules/path/path.module b/modules/path/path.module
index 1bb06f42b..81c7bb2c5 100644
--- a/modules/path/path.module
+++ b/modules/path/path.module
@@ -137,8 +137,6 @@ function path_form_node_form_alter(&$form, $form_state) {
'#title' => t('URL alias'),
'#default_value' => $path['alias'],
'#maxlength' => 255,
- '#collapsible' => TRUE,
- '#collapsed' => TRUE,
'#description' => t('Optionally specify an alternative URL by which this content can be accessed. For example, type "about" when writing an about page. Use a relative path and don\'t add a trailing slash or the URL alias won\'t work.'),
);
$form['path']['pid'] = array('#type' => 'value', '#value' => $path['pid']);
diff --git a/modules/poll/poll-results.tpl.php b/modules/poll/poll-results.tpl.php
index 5e14dec21..678bc2b12 100644
--- a/modules/poll/poll-results.tpl.php
+++ b/modules/poll/poll-results.tpl.php
@@ -15,6 +15,8 @@
* - $vote: The choice number of the current user's vote.
*
* @see template_preprocess_poll_results()
+ *
+ * @ingroup themeable
*/
?>
<div class="poll">
diff --git a/modules/poll/poll-vote.tpl.php b/modules/poll/poll-vote.tpl.php
index 068ff7c05..699a26d42 100644
--- a/modules/poll/poll-vote.tpl.php
+++ b/modules/poll/poll-vote.tpl.php
@@ -12,6 +12,8 @@
* form_alter hooks.
*
* @see template_preprocess_poll_vote()
+ *
+ * @ingroup themeable
*/
?>
<div class="poll">
diff --git a/modules/poll/poll.module b/modules/poll/poll.module
index 6cea88648..70eb65dce 100644
--- a/modules/poll/poll.module
+++ b/modules/poll/poll.module
@@ -817,7 +817,7 @@ function poll_view_results($node, $view_mode, $block = FALSE) {
// Make sure that choices are ordered by their weight.
uasort($node->choice, 'drupal_sort_weight');
- // Count the votes and find the maximum
+ // Count the votes and find the maximum.
$total_votes = 0;
$max_votes = 0;
foreach ($node->choice as $choice) {
diff --git a/modules/poll/poll.test b/modules/poll/poll.test
index 9982222c8..35eea2237 100644
--- a/modules/poll/poll.test
+++ b/modules/poll/poll.test
@@ -64,7 +64,7 @@ class PollTestCase extends DrupalWebTestCase {
$this->drupalPost(NULL, $edit, t('Save'));
$node = $this->drupalGetNodeByTitle($title);
$this->assertText(t('@type @title has been created.', array('@type' => node_type_get_name('poll'), '@title' => $title)), 'Poll has been created.');
- $this->assertTrue($node->nid, t('Poll has been found in the database.'));
+ $this->assertTrue($node->nid, 'Poll has been found in the database.');
return isset($node->nid) ? $node->nid : FALSE;
}
@@ -137,7 +137,7 @@ class PollTestCase extends DrupalWebTestCase {
// The expected weight of each choice is higher than the previous one.
$weight++;
// Directly assert the weight form element value for this choice.
- $this->assertFieldByName('choice[chid:' . $id . '][weight]', $weight, t('Found choice @id with weight @weight.', array(
+ $this->assertFieldByName('choice[chid:' . $id . '][weight]', $weight, format_string('Found choice @id with weight @weight.', array(
'@id' => $id,
'@weight' => $weight,
)));
@@ -167,7 +167,7 @@ class PollTestCase extends DrupalWebTestCase {
$expected_order = $expected;
foreach ($elements as $element) {
$next_label = array_shift($expected_order);
- $this->assertEqual((string) $element, $next_label, t('Found choice @label in preview.', array(
+ $this->assertEqual((string) $element, $next_label, format_string('Found choice @label in preview.', array(
'@label' => $next_label,
)));
}
@@ -232,7 +232,7 @@ class PollCreateTestCase extends PollTestCase {
$this->assertEqual(end($option), $new_option, 'Last item is equal to new option.');
$votes = $this->xpath('//div[@id="node-1"]//div[@class="poll"]//div[@class="percent"]');
- $this->assertTrue(strpos(end($votes), $vote_count) > 0, t("Votes saved."));
+ $this->assertTrue(strpos(end($votes), $vote_count) > 0, "Votes saved.");
}
function testPollClose() {
@@ -254,7 +254,7 @@ class PollCreateTestCase extends PollTestCase {
// Verify 'Vote' button no longer appears.
$this->drupalGet('node/' . $poll_nid);
$elements = $this->xpath('//input[@id="edit-vote"]');
- $this->assertTrue(empty($elements), t("Vote button doesn't appear."));
+ $this->assertTrue(empty($elements), "Vote button doesn't appear.");
// Verify status on 'poll' page is 'closed'.
$this->drupalGet('poll');
@@ -272,7 +272,7 @@ class PollCreateTestCase extends PollTestCase {
$this->drupalPost('node/' . $poll_nid, $vote_edit, t('Vote'));
$this->assertText('Your vote was recorded.', 'Your vote was recorded.');
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(isset($elements[0]), t("'Cancel your vote' button appears."));
+ $this->assertTrue(isset($elements[0]), "'Cancel your vote' button appears.");
// Edit the poll node and close the poll.
$this->drupalLogout();
@@ -283,7 +283,7 @@ class PollCreateTestCase extends PollTestCase {
// Verify 'Cancel your vote' button no longer appears.
$this->drupalGet('node/' . $poll_nid);
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(empty($elements), t("'Cancel your vote' button no longer appears."));
+ $this->assertTrue(empty($elements), "'Cancel your vote' button no longer appears.");
}
}
@@ -323,7 +323,7 @@ class PollVoteTestCase extends PollTestCase {
$this->assertText('Your vote was recorded.', 'Your vote was recorded.');
$this->assertText('Total votes: 1', 'Vote count updated correctly.');
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(isset($elements[0]), t("'Cancel your vote' button appears."));
+ $this->assertTrue(isset($elements[0]), "'Cancel your vote' button appears.");
$this->drupalGet("node/$poll_nid/votes");
$this->assertText(t('This table lists all the recorded votes for this poll. If anonymous users are allowed to vote, they will be identified by the IP address of the computer they used when they voted.'), 'Vote table text.');
@@ -359,7 +359,7 @@ class PollVoteTestCase extends PollTestCase {
$this->assertText('Your vote was recorded.', 'Your vote was recorded.');
$this->assertText('Total votes: 1', 'Vote count updated correctly.');
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(empty($elements), t("'Cancel your vote' button does not appear."));
+ $this->assertTrue(empty($elements), "'Cancel your vote' button does not appear.");
}
}
@@ -383,13 +383,13 @@ class PollBlockTestCase extends PollTestCase {
function testRecentBlock() {
// Set block title to confirm that the interface is available.
$this->drupalPost('admin/structure/block/manage/poll/recent/configure', array('title' => $this->randomName(8)), t('Save block'));
- $this->assertText(t('The block configuration has been saved.'), t('Block configuration set.'));
+ $this->assertText(t('The block configuration has been saved.'), 'Block configuration set.');
// Set the block to a region to confirm block is available.
$edit = array();
$edit['blocks[poll_recent][region]'] = 'footer';
$this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
- $this->assertText(t('The block settings have been updated.'), t('Block successfully move to footer region.'));
+ $this->assertText(t('The block settings have been updated.'), 'Block successfully move to footer region.');
// Create a poll which should appear in recent polls block.
$title = $this->randomName();
@@ -465,9 +465,9 @@ class PollJSAddChoice extends DrupalWebTestCase {
$commands = $this->drupalPostAJAX(NULL, $edit, array('op' => t('More choices')));
$this->content = $commands[1]['data'];
- $this->assertFieldByName('choice[chid:0][chtext]', $edit['choice[new:0][chtext]'], t('Field !i found', array('!i' => 0)));
- $this->assertFieldByName('choice[chid:1][chtext]', $edit['choice[new:1][chtext]'], t('Field !i found', array('!i' => 1)));
- $this->assertFieldByName('choice[new:0][chtext]', '', t('Field !i found', array('!i' => 2)));
+ $this->assertFieldByName('choice[chid:0][chtext]', $edit['choice[new:0][chtext]'], format_string('Field !i found', array('!i' => 0)));
+ $this->assertFieldByName('choice[chid:1][chtext]', $edit['choice[new:1][chtext]'], format_string('Field !i found', array('!i' => 1)));
+ $this->assertFieldByName('choice[new:0][chtext]', '', format_string('Field !i found', array('!i' => 2)));
}
}
@@ -524,49 +524,49 @@ class PollVoteCheckHostname extends PollTestCase {
// User1 vote on Poll.
$this->drupalPost('node/' . $this->poll_nid, $edit, t('Vote'));
- $this->assertText(t('Your vote was recorded.'), t('%user vote was recorded.', array('%user' => $this->web_user1->name)));
- $this->assertText(t('Total votes: @votes', array('@votes' => 1)), t('Vote count updated correctly.'));
+ $this->assertText(t('Your vote was recorded.'), format_string('%user vote was recorded.', array('%user' => $this->web_user1->name)));
+ $this->assertText(t('Total votes: @votes', array('@votes' => 1)), 'Vote count updated correctly.');
// Check to make sure User1 cannot vote again.
$this->drupalGet('node/' . $this->poll_nid);
$elements = $this->xpath('//input[@value="Vote"]');
- $this->assertTrue(empty($elements), t("%user is not able to vote again.", array('%user' => $this->web_user1->name)));
+ $this->assertTrue(empty($elements), format_string("%user is not able to vote again.", array('%user' => $this->web_user1->name)));
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(!empty($elements), t("'Cancel your vote' button appears."));
+ $this->assertTrue(!empty($elements), "'Cancel your vote' button appears.");
// Logout User1.
$this->drupalLogout();
// Fill the page cache by requesting the poll.
$this->drupalGet('node/' . $this->poll_nid);
- $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'MISS', t('Page was cacheable but was not in the cache.'));
+ $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'MISS', 'Page was cacheable but was not in the cache.');
$this->drupalGet('node/' . $this->poll_nid);
- $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'HIT', t('Page was cached.'));
+ $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'HIT', 'Page was cached.');
// Anonymous user vote on Poll.
$this->drupalPost(NULL, $edit, t('Vote'));
- $this->assertText(t('Your vote was recorded.'), t('Anonymous vote was recorded.'));
- $this->assertText(t('Total votes: @votes', array('@votes' => 2)), t('Vote count updated correctly.'));
+ $this->assertText(t('Your vote was recorded.'), 'Anonymous vote was recorded.');
+ $this->assertText(t('Total votes: @votes', array('@votes' => 2)), 'Vote count updated correctly.');
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(!empty($elements), t("'Cancel your vote' button appears."));
+ $this->assertTrue(!empty($elements), "'Cancel your vote' button appears.");
// Check to make sure Anonymous user cannot vote again.
$this->drupalGet('node/' . $this->poll_nid);
- $this->assertFalse($this->drupalGetHeader('x-drupal-cache'), t('Page was not cacheable.'));
+ $this->assertFalse($this->drupalGetHeader('x-drupal-cache'), 'Page was not cacheable.');
$elements = $this->xpath('//input[@value="Vote"]');
- $this->assertTrue(empty($elements), t("Anonymous is not able to vote again."));
+ $this->assertTrue(empty($elements), "Anonymous is not able to vote again.");
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(!empty($elements), t("'Cancel your vote' button appears."));
+ $this->assertTrue(!empty($elements), "'Cancel your vote' button appears.");
// Login User2.
$this->drupalLogin($this->web_user2);
// User2 vote on poll.
$this->drupalPost('node/' . $this->poll_nid, $edit, t('Vote'));
- $this->assertText(t('Your vote was recorded.'), t('%user vote was recorded.', array('%user' => $this->web_user2->name)));
+ $this->assertText(t('Your vote was recorded.'), format_string('%user vote was recorded.', array('%user' => $this->web_user2->name)));
$this->assertText(t('Total votes: @votes', array('@votes' => 3)), 'Vote count updated correctly.');
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(empty($elements), t("'Cancel your vote' button does not appear."));
+ $this->assertTrue(empty($elements), "'Cancel your vote' button does not appear.");
// Logout User2.
$this->drupalLogout();
@@ -582,22 +582,22 @@ class PollVoteCheckHostname extends PollTestCase {
// Check to make sure Anonymous user can vote again with a new session after
// a hostname change.
$this->drupalGet('node/' . $this->poll_nid);
- $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'MISS', t('Page was cacheable but was not in the cache.'));
+ $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'MISS', 'Page was cacheable but was not in the cache.');
$this->drupalPost(NULL, $edit, t('Vote'));
- $this->assertText(t('Your vote was recorded.'), t('%user vote was recorded.', array('%user' => $this->web_user2->name)));
+ $this->assertText(t('Your vote was recorded.'), format_string('%user vote was recorded.', array('%user' => $this->web_user2->name)));
$this->assertText(t('Total votes: @votes', array('@votes' => 4)), 'Vote count updated correctly.');
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(!empty($elements), t("'Cancel your vote' button appears."));
+ $this->assertTrue(!empty($elements), "'Cancel your vote' button appears.");
// Check to make sure Anonymous user cannot vote again with a new session,
// and that the vote from the previous session cannot be cancelledd.
$this->curlClose();
$this->drupalGet('node/' . $this->poll_nid);
- $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'MISS', t('Page was cacheable but was not in the cache.'));
+ $this->assertEqual($this->drupalGetHeader('x-drupal-cache'), 'MISS', 'Page was cacheable but was not in the cache.');
$elements = $this->xpath('//input[@value="Vote"]');
- $this->assertTrue(empty($elements), t('Anonymous is not able to vote again.'));
+ $this->assertTrue(empty($elements), 'Anonymous is not able to vote again.');
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(empty($elements), t("'Cancel your vote' button does not appear."));
+ $this->assertTrue(empty($elements), "'Cancel your vote' button does not appear.");
// Login User1.
$this->drupalLogin($this->web_user1);
@@ -605,9 +605,9 @@ class PollVoteCheckHostname extends PollTestCase {
// Check to make sure User1 still cannot vote even after hostname changed.
$this->drupalGet('node/' . $this->poll_nid);
$elements = $this->xpath('//input[@value="Vote"]');
- $this->assertTrue(empty($elements), t("%user is not able to vote again.", array('%user' => $this->web_user1->name)));
+ $this->assertTrue(empty($elements), format_string("%user is not able to vote again.", array('%user' => $this->web_user1->name)));
$elements = $this->xpath('//input[@value="Cancel your vote"]');
- $this->assertTrue(!empty($elements), t("'Cancel your vote' button appears."));
+ $this->assertTrue(!empty($elements), "'Cancel your vote' button appears.");
}
}
@@ -683,11 +683,11 @@ class PollTokenReplaceTestCase extends PollTestCase {
$tests['[node:poll-duration]'] = format_interval($poll->runtime, 1, $language->language);
// Test to make sure that we generated something for each token.
- $this->assertFalse(in_array(0, array_map('strlen', $tests)), t('No empty tokens generated.'));
+ $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
foreach ($tests as $input => $expected) {
$output = token_replace($input, array('node' => $poll), array('language' => $language));
- $this->assertEqual($output, $expected, t('Sanitized poll token %token replaced.', array('%token' => $input)));
+ $this->assertEqual($output, $expected, format_string('Sanitized poll token %token replaced.', array('%token' => $input)));
}
// Generate and test unsanitized tokens.
@@ -695,7 +695,7 @@ class PollTokenReplaceTestCase extends PollTestCase {
foreach ($tests as $input => $expected) {
$output = token_replace($input, array('node' => $poll), array('language' => $language, 'sanitize' => FALSE));
- $this->assertEqual($output, $expected, t('Unsanitized poll token %token replaced.', array('%token' => $input)));
+ $this->assertEqual($output, $expected, format_string('Unsanitized poll token %token replaced.', array('%token' => $input)));
}
}
}
@@ -718,33 +718,33 @@ class PollExpirationTestCase extends PollTestCase {
$title = $this->randomName();
$choices = $this->_generateChoices(2);
$poll_nid = $this->pollCreate($title, $choices, FALSE);
- $this->assertTrue($poll_nid, t('Poll for auto-expire test created.'));
+ $this->assertTrue($poll_nid, 'Poll for auto-expire test created.');
// Visit the poll edit page and verify that by default, expiration
// is set to unlimited.
$this->drupalGet("node/$poll_nid/edit");
- $this->assertField('runtime', t('Poll expiration setting found.'));
+ $this->assertField('runtime', 'Poll expiration setting found.');
$elements = $this->xpath('//select[@id="edit-runtime"]/option[@selected="selected"]');
- $this->assertTrue(isset($elements[0]['value']) && $elements[0]['value'] == 0, t('Poll expiration set to unlimited.'));
+ $this->assertTrue(isset($elements[0]['value']) && $elements[0]['value'] == 0, 'Poll expiration set to unlimited.');
// Set the expiration to one week.
$edit = array();
$poll_expiration = 604800; // One week.
$edit['runtime'] = $poll_expiration;
$this->drupalPost(NULL, $edit, t('Save'));
- $this->assertRaw(t('Poll %title has been updated.', array('%title' => $title)), t('Poll expiration settings saved.'));
+ $this->assertRaw(t('Poll %title has been updated.', array('%title' => $title)), 'Poll expiration settings saved.');
// Make sure that the changed expiration settings is kept.
$this->drupalGet("node/$poll_nid/edit");
$elements = $this->xpath('//select[@id="edit-runtime"]/option[@selected="selected"]');
- $this->assertTrue(isset($elements[0]['value']) && $elements[0]['value'] == $poll_expiration, t('Poll expiration set to unlimited.'));
+ $this->assertTrue(isset($elements[0]['value']) && $elements[0]['value'] == $poll_expiration, 'Poll expiration set to unlimited.');
// Force a cron run. Since the expiration date has not yet been reached,
// the poll should remain active.
drupal_cron_run();
$this->drupalGet("node/$poll_nid/edit");
$elements = $this->xpath('//input[@id="edit-active-1"]');
- $this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), t('Poll is still active.'));
+ $this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), 'Poll is still active.');
// Test expiration. Since REQUEST_TIME is a constant and we don't
// want to keep SimpleTest waiting until the moment of expiration arrives,
@@ -759,7 +759,7 @@ class PollExpirationTestCase extends PollTestCase {
drupal_cron_run();
$this->drupalGet("node/$poll_nid/edit");
$elements = $this->xpath('//input[@id="edit-active-0"]');
- $this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), t('Poll has expired.'));
+ $this->assertTrue(isset($elements[0]) && !empty($elements[0]['checked']), 'Poll has expired.');
}
}
@@ -781,7 +781,7 @@ class PollDeleteChoiceTestCase extends PollTestCase {
$title = $this->randomName();
$choices = array('First choice', 'Second choice', 'Third choice');
$poll_nid = $this->pollCreate($title, $choices, FALSE);
- $this->assertTrue($poll_nid, t('Poll for choice deletion logic test created.'));
+ $this->assertTrue($poll_nid, 'Poll for choice deletion logic test created.');
// Edit the poll, and try to delete first poll choice.
$this->drupalGet("node/$poll_nid/edit");
@@ -793,9 +793,9 @@ class PollDeleteChoiceTestCase extends PollTestCase {
$this->clickLink($title);
// Check the first poll choice is deleted, while the others remain.
- $this->assertNoText('First choice', t('First choice removed.'));
- $this->assertText('Second choice', t('Second choice remains.'));
- $this->assertText('Third choice', t('Third choice remains.'));
+ $this->assertNoText('First choice', 'First choice removed.');
+ $this->assertText('Second choice', 'Second choice remains.');
+ $this->assertText('Third choice', 'Third choice remains.');
}
}
@@ -828,7 +828,7 @@ class PollTranslateTestCase extends PollTestCase {
$title = $this->randomName();
$choices = array($this->randomName(), $this->randomName());
$poll_nid = $this->pollCreate($title, $choices, FALSE);
- $this->assertTrue($poll_nid, t('Poll for translation logic test created.'));
+ $this->assertTrue($poll_nid, 'Poll for translation logic test created.');
$this->drupalLogout();
$this->drupalLogin($admin_user);
@@ -838,14 +838,14 @@ class PollTranslateTestCase extends PollTestCase {
$edit = array();
$edit['langcode'] = 'nl';
$this->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
- $this->assertRaw(t('The language %language has been created and can now be used.', array('%language' => 'Dutch')), t('Language Dutch has been created.'));
+ $this->assertRaw(t('The language %language has been created and can now be used.', array('%language' => 'Dutch')), 'Language Dutch has been created.');
// Set "Poll" content type to use multilingual support with translation.
$this->drupalGet('admin/structure/types/manage/poll');
$edit = array();
$edit['language_content_type'] = 2;
$this->drupalPost('admin/structure/types/manage/poll', $edit, t('Save content type'));
- $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Poll')), t('Poll content type has been updated.'));
+ $this->assertRaw(t('The content type %type has been updated.', array('%type' => 'Poll')), 'Poll content type has been updated.');
// Edit poll.
$this->drupalGet("node/$poll_nid/edit");
@@ -866,7 +866,7 @@ class PollTranslateTestCase extends PollTestCase {
$this->assertFieldByName('choice[chid:1][chvotes]', '0', ('Found choice with vote count 0'));
$this->assertFieldByName('choice[chid:2][chvotes]', '0', ('Found choice with vote count 0'));
// Check that the choice names got copied from the Dutch poll.
- $this->assertFieldByName('choice[chid:1][chtext]', $dutch_poll->choice[1]['chtext'], t('Found choice with text @text', array('@text' => $dutch_poll->choice[1]['chtext'])));
- $this->assertFieldByName('choice[chid:2][chtext]', $dutch_poll->choice[2]['chtext'], t('Found choice with text @text', array('@text' => $dutch_poll->choice[2]['chtext'])));
+ $this->assertFieldByName('choice[chid:1][chtext]', $dutch_poll->choice[1]['chtext'], format_string('Found choice with text @text', array('@text' => $dutch_poll->choice[1]['chtext'])));
+ $this->assertFieldByName('choice[chid:2][chtext]', $dutch_poll->choice[2]['chtext'], format_string('Found choice with text @text', array('@text' => $dutch_poll->choice[2]['chtext'])));
}
}
diff --git a/modules/profile/profile-wrapper.tpl.php b/modules/profile/profile-wrapper.tpl.php
index 997ab9860..3940ba02e 100644
--- a/modules/profile/profile-wrapper.tpl.php
+++ b/modules/profile/profile-wrapper.tpl.php
@@ -6,7 +6,7 @@
* profiles.
*
* This template is used when viewing a list of users. It can be a general
- * list for viewing all users with the url of "example.com/profile" or when
+ * list for viewing all users with the URL of "example.com/profile" or when
* viewing a set of users who share a specific value for a profile such
* as "example.com/profile/country/belgium".
*
diff --git a/modules/profile/profile.module b/modules/profile/profile.module
index 6b00d4296..d76d08ac6 100644
--- a/modules/profile/profile.module
+++ b/modules/profile/profile.module
@@ -229,7 +229,7 @@ function profile_user_insert(&$edit, $account, $category) {
/**
* Implements hook_user_cancel().
*/
-function profile_user_cancel(&$edit, $account, $method) {
+function profile_user_cancel($edit, $account, $method) {
switch ($method) {
case 'user_cancel_reassign':
db_delete('profile_value')
diff --git a/modules/rdf/rdf.test b/modules/rdf/rdf.test
index 9f786ab5b..b8aeb90a1 100644
--- a/modules/rdf/rdf.test
+++ b/modules/rdf/rdf.test
@@ -159,7 +159,7 @@ class RdfRdfaMarkupTestCase extends DrupalWebTestCase {
$image = current($this->drupalGetTestFiles('image'));
// Create an array for drupalPost with the field names as the keys and
- // the uris for the test files as the values.
+ // the URIs for the test files as the values.
$edit = array("files[" . $field_name . "_" . $langcode . "_0]" => drupal_realpath($file->uri),
"files[" . $image_field . "_" . $langcode . "_0]" => drupal_realpath($image->uri));
diff --git a/modules/search/search-result.tpl.php b/modules/search/search-result.tpl.php
index 949452ac3..47e89ef8e 100644
--- a/modules/search/search-result.tpl.php
+++ b/modules/search/search-result.tpl.php
@@ -60,6 +60,8 @@
* @see template_preprocess()
* @see template_preprocess_search_result()
* @see template_process()
+ *
+ * @ingroup themeable
*/
?>
<li class="<?php print $classes; ?>"<?php print $attributes; ?>>
diff --git a/modules/search/search-results.tpl.php b/modules/search/search-results.tpl.php
index e35be1edc..aa9bf8d4d 100644
--- a/modules/search/search-results.tpl.php
+++ b/modules/search/search-results.tpl.php
@@ -19,6 +19,8 @@
*
*
* @see template_preprocess_search_results()
+ *
+ * @ingroup themeable
*/
?>
<?php if ($search_results): ?>
diff --git a/modules/shortcut/shortcut.admin.js b/modules/shortcut/shortcut.admin.js
index 5554e5a7c..422cc4ce3 100644
--- a/modules/shortcut/shortcut.admin.js
+++ b/modules/shortcut/shortcut.admin.js
@@ -50,7 +50,7 @@ Drupal.behaviors.shortcutDrag = {
// the tableDrag system. However, the row that swapped with it
// has moved to the "disabled" section, so we need to force its
// status to be disabled and mark it also as changed.
- var changedRowObject = new tableDrag.row(changedRow, 'mouse', self.indentEnabled, self.maxDepth, true);
+ var changedRowObject = new tableDrag.row(changedRow, 'mouse', false, 0, true);
changedRowObject.markChanged();
tableDrag.rowStatusChange(changedRowObject);
}
diff --git a/modules/shortcut/shortcut.module b/modules/shortcut/shortcut.module
index 4c67a1416..71284bb84 100644
--- a/modules/shortcut/shortcut.module
+++ b/modules/shortcut/shortcut.module
@@ -86,7 +86,7 @@ function shortcut_menu() {
'title' => 'Edit shortcuts',
'page callback' => 'drupal_get_form',
'page arguments' => array('shortcut_set_customize', 4),
- 'title callback' => 'shortcut_set_title',
+ 'title callback' => 'shortcut_set_title_callback',
'title arguments' => array(4),
'access callback' => 'shortcut_set_edit_access',
'access arguments' => array(4),
@@ -735,9 +735,15 @@ function shortcut_toolbar_pre_render($toolbar) {
}
/**
- * Returns the title of a shortcut set.
+ * Returns the sanitized title of a shortcut set.
*
- * Title callback for the editing pages for shortcut sets.
+ * Deprecated. This function was previously used as a menu item title callback
+ * but has been replaced by shortcut_set_title_callback() (which does not
+ * sanitize the title, since the menu system does that automatically). In
+ * Drupal 7, use that function for title callbacks, and call check_plain()
+ * directly if you need a sanitized title. In Drupal 8, this function will be
+ * restored as a title callback and therefore will no longer sanitize its
+ * output.
*
* @param $shortcut_set
* An object representing the shortcut set, as returned by
@@ -747,3 +753,15 @@ function shortcut_set_title($shortcut_set) {
return check_plain($shortcut_set->title);
}
+/**
+ * Returns the title of a shortcut set.
+ *
+ * Title callback for the editing pages for shortcut sets.
+ *
+ * @param $shortcut_set
+ * An object representing the shortcut set, as returned by
+ * shortcut_set_load().
+ */
+function shortcut_set_title_callback($shortcut_set) {
+ return $shortcut_set->title;
+}
diff --git a/modules/simpletest/drupal_web_test_case.php b/modules/simpletest/drupal_web_test_case.php
index d83dbeb6f..a67c77191 100644
--- a/modules/simpletest/drupal_web_test_case.php
+++ b/modules/simpletest/drupal_web_test_case.php
@@ -632,7 +632,7 @@ abstract class DrupalTestCase {
* 'one' => array(0, 1),
* 'two' => array(2, 3),
* );
- * $permutations = $this->permute($parameters);
+ * $permutations = DrupalTestCase::generatePermutations($parameters)
* // Result:
* $permutations == array(
* array('one' => 0, 'two' => 2),
@@ -1685,13 +1685,20 @@ class DrupalWebTestCase extends DrupalTestCase {
if (!isset($this->curlHandle)) {
$this->curlHandle = curl_init();
+
+ // Some versions/configurations of cURL break on a NULL cookie jar, so
+ // supply a real file.
+ if (empty($this->cookieFile)) {
+ $this->cookieFile = $this->public_files_directory . '/cookie.jar';
+ }
+
$curl_options = array(
CURLOPT_COOKIEJAR => $this->cookieFile,
CURLOPT_URL => $base_url,
CURLOPT_FOLLOWLOCATION => FALSE,
CURLOPT_RETURNTRANSFER => TRUE,
- CURLOPT_SSL_VERIFYPEER => FALSE, // Required to make the tests run on https.
- CURLOPT_SSL_VERIFYHOST => FALSE, // Required to make the tests run on https.
+ CURLOPT_SSL_VERIFYPEER => FALSE, // Required to make the tests run on HTTPS.
+ CURLOPT_SSL_VERIFYHOST => FALSE, // Required to make the tests run on HTTPS.
CURLOPT_HEADERFUNCTION => array(&$this, 'curlHeaderCallback'),
CURLOPT_USERAGENT => $this->databasePrefix,
);
@@ -1699,7 +1706,12 @@ class DrupalWebTestCase extends DrupalTestCase {
$curl_options[CURLOPT_HTTPAUTH] = $this->httpauth_method;
$curl_options[CURLOPT_USERPWD] = $this->httpauth_credentials;
}
- curl_setopt_array($this->curlHandle, $this->additionalCurlOptions + $curl_options);
+ // curl_setopt_array() returns FALSE if any of the specified options
+ // cannot be set, and stops processing any further options.
+ $result = curl_setopt_array($this->curlHandle, $this->additionalCurlOptions + $curl_options);
+ if (!$result) {
+ throw new Exception('One or more cURL options could not be set.');
+ }
// By default, the child session name should be the same as the parent.
$this->session_name = session_name();
@@ -2686,10 +2698,10 @@ class DrupalWebTestCase extends DrupalTestCase {
}
/**
- * Get the current url from the cURL handler.
+ * Get the current URL from the cURL handler.
*
* @return
- * The current url.
+ * The current URL.
*/
protected function getUrl() {
return $this->url;
diff --git a/modules/simpletest/simpletest.api.php b/modules/simpletest/simpletest.api.php
index 04c080bfd..d262ad613 100644
--- a/modules/simpletest/simpletest.api.php
+++ b/modules/simpletest/simpletest.api.php
@@ -20,7 +20,7 @@
*/
function hook_simpletest_alter(&$groups) {
// An alternative session handler module would not want to run the original
- // Session https handling test because it checks the sessions table in the
+ // Session HTTPS handling test because it checks the sessions table in the
// database.
unset($groups['Session']['testHttpsSession']);
}
diff --git a/modules/simpletest/simpletest.info b/modules/simpletest/simpletest.info
index b0bf9b228..5583c2f82 100644
--- a/modules/simpletest/simpletest.info
+++ b/modules/simpletest/simpletest.info
@@ -40,7 +40,6 @@ files[] = tests/update.test
files[] = tests/xmlrpc.test
files[] = tests/upgrade/upgrade.test
files[] = tests/upgrade/upgrade.comment.test
-files[] = tests/upgrade/update.field.test
files[] = tests/upgrade/upgrade.filter.test
files[] = tests/upgrade/upgrade.forum.test
files[] = tests/upgrade/upgrade.locale.test
@@ -49,7 +48,9 @@ files[] = tests/upgrade/upgrade.node.test
files[] = tests/upgrade/upgrade.taxonomy.test
files[] = tests/upgrade/upgrade.trigger.test
files[] = tests/upgrade/upgrade.translatable.test
-files[] = tests/upgrade/update.trigger.test
files[] = tests/upgrade/upgrade.upload.test
-files[] = tests/upgrade/update.user.test
files[] = tests/upgrade/upgrade.user.test
+files[] = tests/upgrade/update.aggregator.test
+files[] = tests/upgrade/update.trigger.test
+files[] = tests/upgrade/update.field.test
+files[] = tests/upgrade/update.user.test
diff --git a/modules/simpletest/tests/ajax_forms_test.module b/modules/simpletest/tests/ajax_forms_test.module
index 6a95710a8..28404224e 100644
--- a/modules/simpletest/tests/ajax_forms_test.module
+++ b/modules/simpletest/tests/ajax_forms_test.module
@@ -7,7 +7,6 @@
/**
* Implements hook_menu().
- * @return unknown_type
*/
function ajax_forms_test_menu() {
$items = array();
@@ -94,9 +93,6 @@ function ajax_forms_test_simple_form_checkbox_callback($form, $form_state) {
/**
* Form to display the Ajax Commands.
- * @param $form
- * @param $form_state
- * @return unknown_type
*/
function ajax_forms_test_ajax_commands_form($form, &$form_state) {
$form = array();
diff --git a/modules/simpletest/tests/common.test b/modules/simpletest/tests/common.test
index 437b67cd1..e8e403330 100644
--- a/modules/simpletest/tests/common.test
+++ b/modules/simpletest/tests/common.test
@@ -1847,14 +1847,14 @@ class DrupalRenderTestCase extends DrupalWebTestCase {
class ValidUrlTestCase extends DrupalUnitTestCase {
public static function getInfo() {
return array(
- 'name' => 'Valid Url',
- 'description' => "Performs tests on Drupal's valid url function.",
+ 'name' => 'Valid URL',
+ 'description' => "Performs tests on Drupal's valid URL function.",
'group' => 'System'
);
}
/**
- * Test valid absolute urls.
+ * Test valid absolute URLs.
*/
function testValidAbsolute() {
$url_schemes = array('http', 'https', 'ftp');
@@ -1889,7 +1889,7 @@ class ValidUrlTestCase extends DrupalUnitTestCase {
}
/**
- * Test invalid absolute urls.
+ * Test invalid absolute URLs.
*/
function testInvalidAbsolute() {
$url_schemes = array('http', 'https', 'ftp');
@@ -1909,7 +1909,7 @@ class ValidUrlTestCase extends DrupalUnitTestCase {
}
/**
- * Test valid relative urls.
+ * Test valid relative URLs.
*/
function testValidRelative() {
$valid_relative_urls = array(
@@ -1930,7 +1930,7 @@ class ValidUrlTestCase extends DrupalUnitTestCase {
}
/**
- * Test invalid relative urls.
+ * Test invalid relative URLs.
*/
function testInvalidRelative() {
$invalid_relative_urls = array(
@@ -2540,12 +2540,12 @@ class DrupalAddFeedTestCase extends DrupalWebTestCase {
'output_url' => url($path, array('absolute' => TRUE)),
'title' => '',
),
- 'external url without title' => array(
+ 'external URL without title' => array(
'input_url' => $external_url,
'output_url' => $external_url,
'title' => '',
),
- 'local url without title' => array(
+ 'local URL without title' => array(
'input_url' => $fully_qualified_local_url,
'output_url' => $fully_qualified_local_url,
'title' => '',
@@ -2555,12 +2555,12 @@ class DrupalAddFeedTestCase extends DrupalWebTestCase {
'output_url' => url($path_for_title, array('absolute' => TRUE)),
'title' => $this->randomName(12),
),
- 'external url with title' => array(
+ 'external URL with title' => array(
'input_url' => $external_for_title,
'output_url' => $external_for_title,
'title' => $this->randomName(12),
),
- 'local url with title' => array(
+ 'local URL with title' => array(
'input_url' => $fully_qualified_for_title,
'output_url' => $fully_qualified_for_title,
'title' => $this->randomName(12),
@@ -2581,9 +2581,36 @@ class DrupalAddFeedTestCase extends DrupalWebTestCase {
* 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).
+ // 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;
}
}
+
+/**
+ * Test for theme_feed_icon().
+ */
+class FeedIconTest extends DrupalWebTestCase {
+
+ public static function getInfo() {
+ return array(
+ 'name' => 'Feed icon',
+ 'description' => 'Check escaping of theme_feed_icon()',
+ 'group' => 'System',
+ );
+ }
+
+ /**
+ * Check that special characters are correctly escaped. Test for issue #1211668.
+ */
+ function testFeedIconEscaping() {
+ $variables = array();
+ $variables['url'] = 'node';
+ $variables['title'] = '<>&"\'';
+ $text = theme_feed_icon($variables);
+ preg_match('/title="(.*?)"/', $text, $matches);
+ $this->assertEqual($matches[1], 'Subscribe to &amp;&quot;&#039;', 'theme_feed_icon() escapes reserved HTML characters.');
+ }
+
+}
diff --git a/modules/simpletest/tests/database_test.test b/modules/simpletest/tests/database_test.test
index 660833606..6e1d15979 100644
--- a/modules/simpletest/tests/database_test.test
+++ b/modules/simpletest/tests/database_test.test
@@ -2803,14 +2803,17 @@ class DatabaseLoggingTestCase extends DatabaseTestCase {
* Test that we can log the existence of a query.
*/
function testEnableLogging() {
- Database::startLog('testing');
+ $log = Database::startLog('testing');
db_query('SELECT name FROM {test} WHERE age > :age', array(':age' => 25))->fetchCol();
db_query('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo'))->fetchCol();
+ // Trigger a call that does not have file in the backtrace.
+ call_user_func_array('db_query', array('SELECT age FROM {test} WHERE name = :name', array(':name' => 'Ringo')))->fetchCol();
+
$queries = Database::getLog('testing', 'default');
- $this->assertEqual(count($queries), 2, t('Correct number of queries recorded.'));
+ $this->assertEqual(count($queries), 3, t('Correct number of queries recorded.'));
foreach ($queries as $query) {
$this->assertEqual($query['caller']['function'], __FUNCTION__, t('Correct function in query log.'));
@@ -3746,9 +3749,9 @@ class DatabaseTransactionTestCase extends DatabaseTestCase {
class DatabaseNextIdCase extends DrupalWebTestCase {
public static function getInfo() {
return array(
- 'name' => t('Sequences API'),
- 'description' => t('Test the secondary sequences API.'),
- 'group' => t('Database'),
+ 'name' => 'Sequences API',
+ 'description' => 'Test the secondary sequences API.',
+ 'group' => 'Database',
);
}
@@ -3773,9 +3776,9 @@ class DatabaseNextIdCase extends DrupalWebTestCase {
class DatabaseEmptyStatementTestCase extends DrupalWebTestCase {
public static function getInfo() {
return array(
- 'name' => t('Empty statement'),
- 'description' => t('Test the empty pseudo-statement class.'),
- 'group' => t('Database'),
+ 'name' => 'Empty statement',
+ 'description' => 'Test the empty pseudo-statement class.',
+ 'group' => 'Database',
);
}
diff --git a/modules/simpletest/tests/entity_crud_hook_test.module b/modules/simpletest/tests/entity_crud_hook_test.module
index 873a162ce..d25dff1b3 100644
--- a/modules/simpletest/tests/entity_crud_hook_test.module
+++ b/modules/simpletest/tests/entity_crud_hook_test.module
@@ -1,8 +1,9 @@
<?php
-//
-// Presave hooks
-//
+/**
+ * @file
+ * Test module for the Entity CRUD API.
+ */
/**
* Implements hook_entity_presave().
@@ -53,10 +54,6 @@ function entity_crud_hook_test_user_presave() {
$_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
}
-//
-// Insert hooks
-//
-
/**
* Implements hook_entity_insert().
*/
@@ -106,10 +103,6 @@ function entity_crud_hook_test_user_insert() {
$_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
}
-//
-// Load hooks
-//
-
/**
* Implements hook_entity_load().
*/
@@ -159,10 +152,6 @@ function entity_crud_hook_test_user_load() {
$_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
}
-//
-// Update hooks
-//
-
/**
* Implements hook_entity_update().
*/
@@ -212,10 +201,6 @@ function entity_crud_hook_test_user_update() {
$_SESSION['entity_crud_hook_test'][] = (__FUNCTION__ . ' called');
}
-//
-// Delete hooks
-//
-
/**
* Implements hook_entity_delete().
*/
diff --git a/modules/simpletest/tests/entity_crud_hook_test.test b/modules/simpletest/tests/entity_crud_hook_test.test
index 3f18fc855..178e34dc7 100644
--- a/modules/simpletest/tests/entity_crud_hook_test.test
+++ b/modules/simpletest/tests/entity_crud_hook_test.test
@@ -1,8 +1,14 @@
<?php
/**
- * Test invocation of hooks when inserting, loading, updating or deleting an
- * entity. Tested hooks are:
+ * @file
+ * CRUD hook tests for the Entity CRUD API.
+ */
+
+/**
+ * Tests invocation of hooks when performing an action.
+ *
+ * Tested hooks are:
* - hook_entity_insert()
* - hook_entity_load()
* - hook_entity_update()
@@ -48,7 +54,7 @@ class EntityCrudHookTestCase extends DrupalWebTestCase {
}
/**
- * Test hook invocations for CRUD operations on comments.
+ * Tests hook invocations for CRUD operations on comments.
*/
public function testCommentHooks() {
$node = (object) array(
@@ -108,7 +114,7 @@ class EntityCrudHookTestCase extends DrupalWebTestCase {
}
/**
- * Test hook invocations for CRUD operations on files.
+ * Tests hook invocations for CRUD operations on files.
*/
public function testFileHooks() {
$url = 'public://entity_crud_hook_test.file';
@@ -154,7 +160,7 @@ class EntityCrudHookTestCase extends DrupalWebTestCase {
}
/**
- * Test hook invocations for CRUD operations on nodes.
+ * Tests hook invocations for CRUD operations on nodes.
*/
public function testNodeHooks() {
$node = (object) array(
@@ -200,7 +206,7 @@ class EntityCrudHookTestCase extends DrupalWebTestCase {
}
/**
- * Test hook invocations for CRUD operations on taxonomy terms.
+ * Tests hook invocations for CRUD operations on taxonomy terms.
*/
public function testTaxonomyTermHooks() {
$vocabulary = (object) array(
@@ -248,7 +254,7 @@ class EntityCrudHookTestCase extends DrupalWebTestCase {
}
/**
- * Test hook invocations for CRUD operations on taxonomy vocabularies.
+ * Tests hook invocations for CRUD operations on taxonomy vocabularies.
*/
public function testTaxonomyVocabularyHooks() {
$vocabulary = (object) array(
@@ -288,7 +294,7 @@ class EntityCrudHookTestCase extends DrupalWebTestCase {
}
/**
- * Test hook invocations for CRUD operations on users.
+ * Tests hook invocations for CRUD operations on users.
*/
public function testUserHooks() {
$edit = array(
diff --git a/modules/simpletest/tests/form.test b/modules/simpletest/tests/form.test
index 985abe31b..675e8d189 100644
--- a/modules/simpletest/tests/form.test
+++ b/modules/simpletest/tests/form.test
@@ -1309,6 +1309,81 @@ class FormsRebuildTestCase extends DrupalWebTestCase {
}
/**
+ * Tests form redirection.
+ */
+class FormsRedirectTestCase extends DrupalWebTestCase {
+
+ public static function getInfo() {
+ return array(
+ 'name' => 'Form redirecting',
+ 'description' => 'Tests functionality of drupal_redirect_form().',
+ 'group' => 'Form API',
+ );
+ }
+
+ function setUp() {
+ parent::setUp(array('form_test'));
+ }
+
+ /**
+ * Tests form redirection.
+ */
+ function testRedirect() {
+ $path = 'form-test/redirect';
+ $options = array('query' => array('foo' => 'bar'));
+ $options['absolute'] = TRUE;
+
+ // Test basic redirection.
+ $edit = array(
+ 'redirection' => TRUE,
+ 'destination' => $this->randomName(),
+ );
+ $this->drupalPost($path, $edit, t('Submit'));
+ $this->assertUrl($edit['destination'], array(), 'Basic redirection works.');
+
+
+ // Test without redirection.
+ $edit = array(
+ 'redirection' => FALSE,
+ );
+ $this->drupalPost($path, $edit, t('Submit'));
+ $this->assertUrl($path, array(), 'When redirect is set to FALSE, there should be no redirection.');
+
+ // Test redirection with query parameters.
+ $edit = array(
+ 'redirection' => TRUE,
+ 'destination' => $this->randomName(),
+ );
+ $this->drupalPost($path, $edit, t('Submit'), $options);
+ $this->assertUrl($edit['destination'], array(), 'Redirection with query parameters works.');
+
+ // Test without redirection but with query parameters.
+ $edit = array(
+ 'redirection' => FALSE,
+ );
+ $this->drupalPost($path, $edit, t('Submit'), $options);
+ $this->assertUrl($path, $options, 'When redirect is set to FALSE, there should be no redirection, and the query parameters should be passed along.');
+
+ // Test redirection back to the original path.
+ $edit = array(
+ 'redirection' => TRUE,
+ 'destination' => '',
+ );
+ $this->drupalPost($path, $edit, t('Submit'));
+ $this->assertUrl($path, array(), 'When using an empty redirection string, there should be no redirection.');
+
+ // Test redirection back to the original path with query parameters.
+ $edit = array(
+ 'redirection' => TRUE,
+ 'destination' => '',
+ );
+ $this->drupalPost($path, $edit, t('Submit'), $options);
+ $this->assertUrl($path, $options, 'When using an empty redirection string, there should be no redirection, and the query parameters should be passed along.');
+ }
+
+}
+
+/**
* Test the programmatic form submission behavior.
*/
class FormsProgrammaticTestCase extends DrupalWebTestCase {
diff --git a/modules/simpletest/tests/form_test.module b/modules/simpletest/tests/form_test.module
index e4ac77b12..5d6527680 100644
--- a/modules/simpletest/tests/form_test.module
+++ b/modules/simpletest/tests/form_test.module
@@ -151,6 +151,14 @@ function form_test_menu() {
'type' => MENU_CALLBACK,
);
+ $items['form-test/redirect'] = array(
+ 'title' => 'Redirect test',
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('form_test_redirect'),
+ 'access callback' => TRUE,
+ 'type' => MENU_CALLBACK,
+ );
+
$items['form_test/form-labels'] = array(
'title' => 'Form label test',
'page callback' => 'drupal_get_form',
@@ -1644,6 +1652,43 @@ function form_test_clicked_button_submit($form, &$form_state) {
}
/**
+ * Form builder to detect form redirect.
+ */
+function form_test_redirect($form, &$form_state) {
+ $form['redirection'] = array(
+ '#type' => 'checkbox',
+ '#title' => t('Use redirection'),
+ );
+ $form['destination'] = array(
+ '#type' => 'textfield',
+ '#title' => t('Redirect destination'),
+ '#states' => array(
+ 'visible' => array(
+ ':input[name="redirection"]' => array('checked' => TRUE),
+ ),
+ ),
+ );
+ $form['submit'] = array(
+ '#type' => 'submit',
+ '#value' => t('Submit'),
+ );
+
+ return $form;
+}
+
+/**
+ * Form submit handler to test different redirect behaviours.
+ */
+function form_test_redirect_submit(&$form, &$form_state) {
+ if (!empty($form_state['values']['redirection'])) {
+ $form_state['redirect'] = !empty($form_state['values']['destination']) ? $form_state['values']['destination'] : NULL;
+ }
+ else {
+ $form_state['redirect'] = FALSE;
+ }
+}
+
+/**
* Implements hook_form_FORM_ID_alter() for the registration form.
*/
function form_test_form_user_register_form_alter(&$form, &$form_state) {
diff --git a/modules/simpletest/tests/https.php b/modules/simpletest/tests/https.php
index b5ffab693..0e1a4edeb 100644
--- a/modules/simpletest/tests/https.php
+++ b/modules/simpletest/tests/https.php
@@ -2,13 +2,13 @@
/**
* @file
- * Fake an https request, for use during testing.
+ * Fake an HTTPS request, for use during testing.
*/
// Set a global variable to indicate a mock HTTPS request.
$is_https_mock = empty($_SERVER['HTTPS']);
-// Change to https.
+// Change to HTTPS.
$_SERVER['HTTPS'] = 'on';
foreach ($_SERVER as $key => $value) {
$_SERVER[$key] = str_replace('modules/simpletest/tests/https.php', 'index.php', $value);
diff --git a/modules/simpletest/tests/image.test b/modules/simpletest/tests/image.test
index 962aa661f..403c9d7d8 100644
--- a/modules/simpletest/tests/image.test
+++ b/modules/simpletest/tests/image.test
@@ -14,7 +14,13 @@ class ImageToolkitTestCase extends DrupalWebTestCase {
protected $image;
function setUp() {
- parent::setUp('image_test');
+ $modules = func_get_args();
+ if (isset($modules[0]) && is_array($modules[0])) {
+ $modules = $modules[0];
+ }
+ $modules[] = 'image_test';
+
+ parent::setUp($modules);
// Use the image_test.module's test toolkit.
$this->toolkit = 'test';
diff --git a/modules/simpletest/tests/mail.test b/modules/simpletest/tests/mail.test
index 09dcde60c..b7ce68544 100644
--- a/modules/simpletest/tests/mail.test
+++ b/modules/simpletest/tests/mail.test
@@ -150,7 +150,7 @@ class DrupalHtmlToTextTestCase extends DrupalWebTestCase {
$tests = array(
// @todo Trailing linefeeds should be trimmed.
'<a href = "http://drupal.org">Drupal.org</a>' => "Drupal.org [1]\n\n[1] http://drupal.org\n",
- // @todo Footer urls should be absolute.
+ // @todo Footer URLs should be absolute.
"<a href = \"$base_path\">Homepage</a>" => "Homepage [1]\n\n[1] $base_url/\n",
'<address>Drupal</address>' => "Drupal\n",
// @todo The <address> tag is currently not supported.
@@ -367,7 +367,7 @@ class DrupalHtmlToTextTestCase extends DrupalWebTestCase {
. '<br /><a href="http://www.example.com">Host, no path</a>'
. '<br /><a href="' . $base_path . 'node/1">Path, no host</a>'
. '<br /><a href="node/1">Relative path</a>';
- // @todo Footnote urls should be absolute.
+ // @todo Footnote URLs should be absolute.
$tt = "Host and path [1]"
. "\nHost, no path [2]"
// @todo The following two references should be combined.
diff --git a/modules/simpletest/tests/menu.test b/modules/simpletest/tests/menu.test
index b31fee6e3..1ecc1b1c1 100644
--- a/modules/simpletest/tests/menu.test
+++ b/modules/simpletest/tests/menu.test
@@ -599,7 +599,7 @@ class MenuRouterTestCase extends DrupalWebTestCase {
}
/**
- * Get a url and assert the title given a case number. If override is true,
+ * Get a URL and assert the title given a case number. If override is true,
* the title is asserted to begin with "Alternative".
*/
private function menuItemTitlesCasesHelper($case_no, $override = FALSE) {
diff --git a/modules/simpletest/tests/module.test b/modules/simpletest/tests/module.test
index f55c08af4..769c4cf89 100644
--- a/modules/simpletest/tests/module.test
+++ b/modules/simpletest/tests/module.test
@@ -25,7 +25,7 @@ class ModuleUnitTest extends DrupalWebTestCase {
$profile_info = install_profile_info('standard', 'en');
$module_list = $profile_info['dependencies'];
- // Install profile is a module that is expected to be loaded.
+ // Installation profile is a module that is expected to be loaded.
$module_list[] = 'standard';
sort($module_list);
@@ -171,12 +171,12 @@ class ModuleUnitTest extends DrupalWebTestCase {
$this->assertFalse(module_exists('php'), t('Disabling a module with unlisted dependents succeeded.'));
$this->assertEqual(variable_get('test_module_disable_order', array()), array('forum', 'poll', 'php'), t('Modules were disabled in the correct order by module_disable().'));
- // Disable a module that is listed as a dependency by the install profile.
- // Make sure that the profile itself is not on the list of dependent
- // modules to be disabled.
+ // Disable a module that is listed as a dependency by the installation
+ // profile. Make sure that the profile itself is not on the list of
+ // dependent modules to be disabled.
$profile = drupal_get_profile();
$info = install_profile_info($profile);
- $this->assertTrue(in_array('comment', $info['dependencies']), t('Comment module is listed as a dependency of the install profile.'));
+ $this->assertTrue(in_array('comment', $info['dependencies']), t('Comment module is listed as a dependency of the installation profile.'));
$this->assertTrue(module_exists('comment'), t('Comment module is enabled.'));
module_disable(array('comment'));
$this->assertFalse(module_exists('comment'), t('Comment module was disabled.'));
diff --git a/modules/simpletest/tests/requirements1_test.install b/modules/simpletest/tests/requirements1_test.install
index 651d911ab..91caca3f5 100644
--- a/modules/simpletest/tests/requirements1_test.install
+++ b/modules/simpletest/tests/requirements1_test.install
@@ -5,7 +5,7 @@
*/
function requirements1_test_requirements($phase) {
$requirements = array();
- // Ensure translations don't break at install time.
+ // Ensure translations don't break during installation.
$t = get_t();
// Always fails requirements.
diff --git a/modules/simpletest/tests/session.test b/modules/simpletest/tests/session.test
index e5ceb7538..a0feffbb0 100644
--- a/modules/simpletest/tests/session.test
+++ b/modules/simpletest/tests/session.test
@@ -289,14 +289,14 @@ class SessionTestCase extends DrupalWebTestCase {
}
/**
- * Ensure that when running under https two session cookies are generated.
+ * Ensure that when running under HTTPS two session cookies are generated.
*/
class SessionHttpsTestCase extends DrupalWebTestCase {
public static function getInfo() {
return array(
- 'name' => 'Session https handling',
- 'description' => 'Ensure that when running under https two session cookies are generated.',
+ 'name' => 'Session HTTPS handling',
+ 'description' => 'Ensure that when running under HTTPS two session cookies are generated.',
'group' => 'Session'
);
}
@@ -384,7 +384,7 @@ class SessionHttpsTestCase extends DrupalWebTestCase {
$this->cookies = array();
if ($is_https) {
- // The functionality does not make sense when running on https.
+ // The functionality does not make sense when running on HTTPS.
return;
}
diff --git a/modules/simpletest/tests/taxonomy_test.module b/modules/simpletest/tests/taxonomy_test.module
index aae13a2d4..f82950c30 100644
--- a/modules/simpletest/tests/taxonomy_test.module
+++ b/modules/simpletest/tests/taxonomy_test.module
@@ -3,6 +3,8 @@
/**
* @file
* Test module for Taxonomy hooks and functions not used in core.
+ *
+ * @see TaxonomyHooksTestCase::testTaxonomyTermHooks()
*/
/**
@@ -55,6 +57,34 @@ function taxonomy_test_taxonomy_term_delete($term) {
}
/**
+ * Implements hook_taxonomy_term_view().
+ */
+function taxonomy_test_taxonomy_term_view($term, $view_mode, $langcode) {
+ if ($view_mode == 'full') {
+ $term->content['taxonomy_test_term_view_check'] = array(
+ '#prefix' => '<div>',
+ '#markup' => t('The antonym is %antonym', array('%antonym' => $term->antonym)),
+ '#suffix' => '</div>',
+ '#weight' => 10,
+ );
+ }
+}
+
+/**
+ * Implements hook_entity_view().
+ */
+function taxonomy_test_entity_view($entity, $type, $view_mode, $langcode) {
+ if ($type == 'taxonomy_term' && $view_mode == 'full') {
+ $entity->content['taxonomy_test_entity_view_check'] = array(
+ '#prefix' => '<div>',
+ '#markup' => t('The antonym is %antonym', array('%antonym' => $entity->antonym)),
+ '#suffix' => '</div>',
+ '#weight' => 20,
+ );
+ }
+}
+
+/**
* Implements hook_form_alter().
*/
function taxonomy_test_form_alter(&$form, $form_state, $form_id) {
diff --git a/modules/simpletest/tests/upgrade/drupal-6.forum.database.php b/modules/simpletest/tests/upgrade/drupal-6.forum.database.php
index 5a2cc3324..059af6d22 100644
--- a/modules/simpletest/tests/upgrade/drupal-6.forum.database.php
+++ b/modules/simpletest/tests/upgrade/drupal-6.forum.database.php
@@ -258,3 +258,17 @@ db_insert('vocabulary_node_types')->fields(array(
))
->execute();
+// Provide all users with the ability to create forum topics.
+$results = db_select('permission', 'p')
+ ->fields('p')
+ ->execute();
+
+foreach ($results as $result) {
+ $permissions = $result->perm . ', create forum topics';
+ db_update('permission')
+ ->fields(array(
+ 'perm' => $permissions,
+ ))
+ ->condition('rid', $result->rid)
+ ->execute();
+}
diff --git a/modules/simpletest/tests/upgrade/drupal-6.menu.database.php b/modules/simpletest/tests/upgrade/drupal-6.menu.database.php
index 8962615fb..7fae337aa 100644
--- a/modules/simpletest/tests/upgrade/drupal-6.menu.database.php
+++ b/modules/simpletest/tests/upgrade/drupal-6.menu.database.php
@@ -126,6 +126,33 @@ db_insert('menu_links')->fields(array(
'p9' => '0',
'updated' => '0',
))
+->values(array(
+ 'menu_name' => 'secondary-links',
+ 'mlid' => '206',
+ 'plid' => '0',
+ 'link_path' => 'node',
+ 'router_path' => 'node',
+ 'link_title' => 'node-page-with-query',
+ 'options' => 'a:2:{s:5:"query";s:14:"page=1&node=10";s:10:"attributes";a:1:{s:5:"title";s:0:"";}}',
+ 'module' => 'menu',
+ 'hidden' => '0',
+ 'external' => '0',
+ 'has_children' => '0',
+ 'expanded' => '0',
+ 'weight' => '2',
+ 'depth' => '1',
+ 'customized' => '1',
+ 'p1' => '206',
+ 'p2' => '0',
+ 'p3' => '0',
+ 'p4' => '0',
+ 'p5' => '0',
+ 'p6' => '0',
+ 'p7' => '0',
+ 'p8' => '0',
+ 'p9' => '0',
+ 'updated' => '0',
+))
->execute();
db_insert('blocks')->fields(array(
'bid',
diff --git a/modules/simpletest/tests/upgrade/drupal-7.aggregator.database.php b/modules/simpletest/tests/upgrade/drupal-7.aggregator.database.php
new file mode 100644
index 000000000..00ea7d228
--- /dev/null
+++ b/modules/simpletest/tests/upgrade/drupal-7.aggregator.database.php
@@ -0,0 +1,149 @@
+<?php
+/**
+ * @file
+ * Test content for the aggregator update path.
+ */
+
+db_insert('aggregator_feed')->fields(array(
+ 'fid',
+ 'title',
+ 'url',
+ 'refresh',
+ 'checked',
+ 'queued',
+ 'link',
+ 'description',
+ 'image',
+ 'hash',
+ 'etag',
+ 'modified',
+ 'block',
+))
+ ->values(array(
+ 'fid' => '1',
+ 'title' => 'Drupal commit log',
+ 'url' => 'http://drupal.org/commitlog/feed',
+ 'refresh' => '3600',
+ 'checked' => '1347209523',
+ 'queued' => '0',
+ 'link' => 'http://drupal.org/versioncontrol/garbage/path',
+ 'description' => '',
+ 'image' => '',
+ 'hash' => '84f57ae5bffa7fd56942a6293be91244d8551cd18204a7c7de6a17065ea4d54d',
+ 'etag' => '"1347206975"',
+ 'modified' => '1347206975',
+ 'block' => '5',
+))
+ ->execute();
+
+db_insert('aggregator_item')->fields(array(
+ 'iid',
+ 'fid',
+ 'title',
+ 'link',
+ 'author',
+ 'description',
+ 'timestamp',
+ 'guid',
+))
+ ->values(array(
+ 'iid' => '1',
+ 'fid' => '1',
+ 'title' => 'Domain Access: Commit b904022 on 7.x-2.x authored by bforchhammer, committed by agentrickard',
+ 'link' => 'http://drupal.org/commitlog/commit/2%2C410/b90402243b4a9dee0d2e2c4a729dcb2f58dc53c0',
+ 'author' => 'bforchhammer',
+ 'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-10\">\n \n \n \n <div class=\"view-content\">\n <div class=\"views-row views-row-1 views-row-odd views-row-first\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/b90402243b4a9dee0d2e2c4a729dcb2f58dc53c0:/domain_source/domain_source.info\">/domain_source/domain_source.info</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">1 addition & 1 deletion</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span></span></span>\n </div>\n </div>\n <div class=\"views-row views-row-2 views-row-even views-row-last\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/b90402243b4a9dee0d2e2c4a729dcb2f58dc53c0:/domain_source/domain_source.views.inc\">/domain_source/domain_source.views.inc</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">13 additions & 1 deletion</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span></span></span>\n </div>\n </div>\n </div>\n \n \n \n \n \n \n</div>\n<pre>Patch #1685658 by bforchhammer. Better handling of current domain for Domain Source.\n</pre>",
+ 'timestamp' => '1347206044',
+ 'guid' => 'VCS Operation 3936918 at http://drupal.org',
+))
+ ->values(array(
+ 'iid' => '2',
+ 'fid' => '1',
+ 'title' => 'Video: Commit b0b7ff0 on 7.x-2.x by Jorrit',
+ 'link' => 'http://drupal.org/commitlog/commit/846/b0b7ff08fed89c76454aa54627cc219361365d7b',
+ 'author' => 'Jorrit',
+ 'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-9\">\n \n \n \n <div class=\"view-content\">\n <div class=\"views-row views-row-1 views-row-odd views-row-first\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/video.git/blob/b0b7ff08fed89c76454aa54627cc219361365d7b:/libraries/phpvideotoolkit/phpvideotoolkit.php5.php\">/libraries/phpvideotoolkit/phpvideotoolkit.php5.php</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">5 additions & 5 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"no-op\"> </span></span></span>\n </div>\n </div>\n <div class=\"views-row views-row-2 views-row-even\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/video.git/blob/b0b7ff08fed89c76454aa54627cc219361365d7b:/tests/TranscoderAbstractionFactoryFfmpeg.test\">/tests/TranscoderAbstractionFactoryFfmpeg.test</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">21 additions & 7 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"minus\">-</span></span></span>\n </div>\n </div>\n <div class=\"views-row views-row-3 views-row-odd views-row-last\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/video.git/blob/b0b7ff08fed89c76454aa54627cc219361365d7b:/transcoders/TranscoderAbstractionFactoryFfmpeg.inc\">/transcoders/TranscoderAbstractionFactoryFfmpeg.inc</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">31 additions & 22 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"minus\">-</span></span></span>\n </div>\n </div>\n </div>\n \n \n \n \n \n \n</div>\n<pre>Issue #1492296 by Jorrit: Added support for avconv binaries instead of FFmpeg.\n</pre>",
+ 'timestamp' => '1347206397',
+ 'guid' => 'VCS Operation 3936924 at http://drupal.org',
+))
+ ->values(array(
+ 'iid' => '3',
+ 'fid' => '1',
+ 'title' => 'Remove Login Tabs: Commit 6e1eb5a on 7.x-1.x by highrockmedia',
+ 'link' => 'http://drupal.org/commitlog/commit/41%2C610/6e1eb5a4a952db3264e7696e840ac3d797f4b477',
+ 'author' => 'highrockmedia',
+ 'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-8\">\n \n \n \n <div class=\"view-content\">\n <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/sandbox/highrockmedia/1702096.git/blob/6e1eb5a4a952db3264e7696e840ac3d797f4b477:/readme.txt\">/readme.txt</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">10 additions & 2 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span></span></span>\n </div>\n </div>\n </div>\n \n \n \n \n \n \n</div>\n<pre>Updating readme\n</pre>",
+ 'timestamp' => '1347206401',
+ 'guid' => 'VCS Operation 3936920 at http://drupal.org',
+))
+ ->values(array(
+ 'iid' => '4',
+ 'fid' => '1',
+ 'title' => 'TimeGroup: Commit 6ed4c08 on 7.x-1.x by Sweetchuck',
+ 'link' => 'http://drupal.org/commitlog/commit/40%2C448/6ed4c085e5d9a8d33e091e1b8a65c73eab2dc99e',
+ 'author' => 'Sweetchuck',
+ 'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-7\">\n \n \n \n <div class=\"view-content\">\n <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/sandbox/Sweetchuck/1666642.git/blob/6ed4c085e5d9a8d33e091e1b8a65c73eab2dc99e:/includes/ctools/export_ui/timegroup.inc\">/includes/ctools/export_ui/timegroup.inc</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">1 addition & 1 deletion</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span><span class=\"no-op\"> </span></span></span>\n </div>\n </div>\n </div>\n \n \n \n \n \n \n</div>\n<pre>CTools UI - Wrong default value for timeoffset fix.\n</pre>",
+ 'timestamp' => '1347206533',
+ 'guid' => 'VCS Operation 3936942 at http://drupal.org',
+))
+ ->values(array(
+ 'iid' => '5',
+ 'fid' => '1',
+ 'title' => 'Domain Access: Commit 1140172 on 6.x-2.x authored by bforchhammer, committed by agentrickard',
+ 'link' => 'http://drupal.org/commitlog/commit/2%2C410/11401723f5c5d11032dd141ba4939ed889a7a915',
+ 'author' => 'bforchhammer',
+ 'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-6\">\n \n \n \n <div class=\"view-content\">\n <div class=\"views-row views-row-1 views-row-odd views-row-first\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/11401723f5c5d11032dd141ba4939ed889a7a915:/domain_source/domain_source.views.inc\">/domain_source/domain_source.views.inc</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">33 additions & 1 deletion</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"no-op\"> </span></span></span>\n </div>\n </div>\n <div class=\"views-row views-row-2 views-row-even views-row-last\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/11401723f5c5d11032dd141ba4939ed889a7a915:/domain_source/includes/domain_source_handler_filter_domain_id.inc\">/domain_source/includes/domain_source_handler_filter_domain_id.inc</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">28 additions & 0 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span></span></span>\n </div>\n </div>\n </div>\n \n \n \n \n \n \n</div>\n<pre>Patch #1685658 by bforchhammer. Better handling of current domain for Domain Source.\n</pre>",
+ 'timestamp' => '1347206541',
+ 'guid' => 'VCS Operation 3936926 at http://drupal.org',
+))
+ ->values(array(
+ 'iid' => '6',
+ 'fid' => '1',
+ 'title' => 'Domain Access: Commit 19b1c36 on 7.x-2.x by agentrickard',
+ 'link' => 'http://drupal.org/commitlog/commit/2%2C410/19b1c366d86cecd8a9f6e1a6e835c0566f5c02db',
+ 'author' => 'agentrickard',
+ 'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-5\">\n \n \n \n <div class=\"view-content\">\n <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/19b1c366d86cecd8a9f6e1a6e835c0566f5c02db:/domain_source/includes/domain_source_handler_filter_domain_id.inc\">/domain_source/includes/domain_source_handler_filter_domain_id.inc</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">28 additions & 0 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span></span></span>\n </div>\n </div>\n </div>\n \n \n \n \n \n \n</div>\n<pre>Adds new Views file to Domain Source.\n</pre>",
+ 'timestamp' => '1347206601',
+ 'guid' => 'VCS Operation 3936928 at http://drupal.org',
+))
+ ->values(array(
+ 'iid' => '7',
+ 'fid' => '1',
+ 'title' => 'Domain Access: Commit d2d5456 on 7.x-3.x by agentrickard',
+ 'link' => 'http://drupal.org/commitlog/commit/2%2C410/d2d5456cad6ca57bb72e743da6a7112a74d7a331',
+ 'author' => 'agentrickard',
+ 'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-4\">\n \n \n \n <div class=\"view-content\">\n <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/domain.git/blob/d2d5456cad6ca57bb72e743da6a7112a74d7a331:/domain_source/includes/domain_source_handler_filter_domain_id.inc\">/domain_source/includes/domain_source_handler_filter_domain_id.inc</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">29 additions & 0 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span></span></span>\n </div>\n </div>\n </div>\n \n \n \n \n \n \n</div>\n<pre>Adds new Views file to Domain Source.\n</pre>",
+ 'timestamp' => '1347206620',
+ 'guid' => 'VCS Operation 3936930 at http://drupal.org',
+))
+ ->values(array(
+ 'iid' => '8',
+ 'fid' => '1',
+ 'title' => 'Skarabee: Commit 400b519 on 7.x-1.x by sboersma',
+ 'link' => 'http://drupal.org/commitlog/commit/23%2C278/400b5190f59b1cb58d6b27fa10ac668e9580aa73',
+ 'author' => 'sboersma',
+ 'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-3\">\n \n \n \n <div class=\"view-content\">\n <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/sandbox/sboersma/1176520.git/blob/400b5190f59b1cb58d6b27fa10ac668e9580aa73:/skarabee.install\">/skarabee.install</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">3 additions & 3 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"no-op\"> </span></span></span>\n </div>\n </div>\n </div>\n \n \n \n \n \n \n</div>\n<pre>sboersma: Changed variable deletion method.\n</pre>",
+ 'timestamp' => '1347206709',
+ 'guid' => 'VCS Operation 3936932 at http://drupal.org',
+))
+ ->values(array(
+ 'iid' => '9',
+ 'fid' => '1',
+ 'title' => 'Config entity listing plugin API: Commit dd3fa73 on 8.x-list by damiankloip',
+ 'link' => 'http://drupal.org/commitlog/commit/43%2C586/dd3fa73b0bcdca833bbde1d1ddb3cefe42003693',
+ 'author' => 'damiankloip',
+ 'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-2\">\n \n \n \n <div class=\"view-content\">\n <div class=\"views-row views-row-1 views-row-odd views-row-first views-row-last\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/sandbox/damiankloip/1778654.git/blob/dd3fa73b0bcdca833bbde1d1ddb3cefe42003693:/core/modules/config/lib/Drupal/config/Tests/ConfigEntityListingTest.php\">/core/modules/config/lib/Drupal/config/Tests/ConfigEntityListingTest.php</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">10 additions & 2 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span></span></span>\n </div>\n </div>\n </div>\n \n \n \n \n \n \n</div>\n<pre>Added tests for getList() method\n</pre>",
+ 'timestamp' => '1347206738',
+ 'guid' => 'VCS Operation 3936936 at http://drupal.org',
+))
+ ->values(array(
+ 'iid' => '10',
+ 'fid' => '1',
+ 'title' => 'AutoSlave: Commit 76891da on 7.x-1.x by gielfeldt',
+ 'link' => 'http://drupal.org/commitlog/commit/42%2C968/76891daf3cea9c294daf56a26760cb1bf33ea58a',
+ 'author' => 'gielfeldt',
+ 'description' => "<div class=\"view view-commitlog-commit-items view-id-commitlog_commit_items view-display-id-block_1 view-dom-id-1\">\n \n \n \n <div class=\"view-content\">\n <div class=\"views-row views-row-1 views-row-odd views-row-first\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/autoslave.git/blob/76891daf3cea9c294daf56a26760cb1bf33ea58a:/autoslave.module\">/autoslave.module</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">10 additions & 7 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span><span class=\"minus\">-</span><span class=\"minus\">-</span></span></span>\n </div>\n </div>\n <div class=\"views-row views-row-2 views-row-even views-row-last\">\n \n <div class=\"views-field-path\">\n <span class=\"field-content\"><a href=\"http://drupalcode.org/project/autoslave.git/blob/76891daf3cea9c294daf56a26760cb1bf33ea58a:/autoslave/database.inc\">/autoslave/database.inc</a></span>\n </div>\n \n <div class=\"views-field-changed-lines\">\n <span class=\"field-content\">10 additions & 2 deletions</span>\n </div>\n \n <div class=\"views-field-visual-diffstat\">\n <span class=\"field-content\"><span class=\"versioncontrol-diffstat clear-block\"><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"plus\">+</span><span class=\"minus\">-</span></span></span>\n </div>\n </div>\n </div>\n \n \n \n \n \n \n</div>\n<pre>Keep track of affected tables per commit.\n</pre>",
+ 'timestamp' => '1347206751',
+ 'guid' => 'VCS Operation 3936934 at http://drupal.org',
+))
+ ->execute();
diff --git a/modules/simpletest/tests/upgrade/drupal-7.filled.standard_all.database.php.gz b/modules/simpletest/tests/upgrade/drupal-7.filled.standard_all.database.php.gz
index 5cc5690e1..472eedb23 100644
--- a/modules/simpletest/tests/upgrade/drupal-7.filled.standard_all.database.php.gz
+++ b/modules/simpletest/tests/upgrade/drupal-7.filled.standard_all.database.php.gz
Binary files differ
diff --git a/modules/simpletest/tests/upgrade/update.aggregator.test b/modules/simpletest/tests/upgrade/update.aggregator.test
new file mode 100644
index 000000000..d4135774e
--- /dev/null
+++ b/modules/simpletest/tests/upgrade/update.aggregator.test
@@ -0,0 +1,47 @@
+<?php
+/**
+ * @file
+ * Tests schema changes in aggregator.module.
+ */
+class AggregatorUpdatePathTestCase extends UpdatePathTestCase {
+
+ public static function getInfo() {
+ return array(
+ 'name' => 'Aggregator update path',
+ 'description' => 'Aggregator update path tests.',
+ 'group' => 'Upgrade path',
+ );
+ }
+
+ public function setUp() {
+ // Use the normal installation and add our feed data.
+ $path = drupal_get_path('module', 'simpletest') . '/tests/upgrade';
+ $this->databaseDumpFiles = array(
+ $path . '/drupal-7.bare.standard_all.database.php.gz',
+ $path . '/drupal-7.aggregator.database.php',
+ );
+ parent::setUp();
+
+ // Our test data only relies on aggregator.module.
+ $this->uninstallModulesExcept(array('aggregator'));
+ }
+
+ /**
+ * Tests that the aggregator.module update is successful.
+ */
+ public function testAggregatorUpdate() {
+ // Get a selection of the fields affected by the schema update.
+ $query = db_select('aggregator_feed', 'af');
+ $query->join('aggregator_item', 'ai', 'af.fid = ai.fid');
+ $query
+ ->fields('af', array('url', 'link'))
+ ->fields('ai', array('link', 'guid'));
+
+ $pre_update_data = $query->execute()->fetchAll();
+ $this->assertTrue($this->performUpgrade(), 'The update was completed successfully.');
+ $post_update_data = $query->execute()->fetchAll();
+
+ $this->assertTrue($pre_update_data == $post_update_data, 'Feed data was preserved during the update.');
+ }
+
+}
diff --git a/modules/simpletest/tests/upgrade/upgrade.forum.test b/modules/simpletest/tests/upgrade/upgrade.forum.test
index 99269d9f4..ebac85415 100644
--- a/modules/simpletest/tests/upgrade/upgrade.forum.test
+++ b/modules/simpletest/tests/upgrade/upgrade.forum.test
@@ -56,5 +56,9 @@ class ForumUpgradePathTestCase extends UpgradePathTestCase {
$this->drupalGet("forum/$tid");
$this->assertText('Bananas');
- }
+ $this->drupalLogout();
+
+ $this->drupalGet("node/add/forum/$tid");
+ $this->assertResponse(200, t('User can access forum creation page.'));
+ }
}
diff --git a/modules/statistics/statistics.test b/modules/statistics/statistics.test
index a40ecc80e..2aff683af 100644
--- a/modules/statistics/statistics.test
+++ b/modules/statistics/statistics.test
@@ -92,18 +92,18 @@ class StatisticsLoggingTestCase extends DrupalWebTestCase {
// Verify logging of an uncached page.
$this->drupalGet($path);
- $this->assertIdentical($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', t('Testing an uncached page.'));
+ $this->assertIdentical($this->drupalGetHeader('X-Drupal-Cache'), 'MISS', 'Testing an uncached page.');
$log = db_query('SELECT * FROM {accesslog}')->fetchAll(PDO::FETCH_ASSOC);
- $this->assertTrue(is_array($log) && count($log) == 1, t('Page request was logged.'));
+ $this->assertTrue(is_array($log) && count($log) == 1, 'Page request was logged.');
$this->assertEqual(array_intersect_key($log[0], $expected), $expected);
$node_counter = statistics_get($this->node->nid);
$this->assertIdentical($node_counter['totalcount'], '1');
// Verify logging of a cached page.
$this->drupalGet($path);
- $this->assertIdentical($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', t('Testing a cached page.'));
+ $this->assertIdentical($this->drupalGetHeader('X-Drupal-Cache'), 'HIT', 'Testing a cached page.');
$log = db_query('SELECT * FROM {accesslog}')->fetchAll(PDO::FETCH_ASSOC);
- $this->assertTrue(is_array($log) && count($log) == 2, t('Page request was logged.'));
+ $this->assertTrue(is_array($log) && count($log) == 2, 'Page request was logged.');
$this->assertEqual(array_intersect_key($log[1], $expected), $expected);
$node_counter = statistics_get($this->node->nid);
$this->assertIdentical($node_counter['totalcount'], '2');
@@ -113,7 +113,7 @@ class StatisticsLoggingTestCase extends DrupalWebTestCase {
$this->drupalGet($path);
$log = db_query('SELECT * FROM {accesslog}')->fetchAll(PDO::FETCH_ASSOC);
// Check the 6th item since login and account pages are also logged
- $this->assertTrue(is_array($log) && count($log) == 6, t('Page request was logged.'));
+ $this->assertTrue(is_array($log) && count($log) == 6, 'Page request was logged.');
$this->assertEqual(array_intersect_key($log[5], $expected), $expected);
$node_counter = statistics_get($this->node->nid);
$this->assertIdentical($node_counter['totalcount'], '3');
@@ -126,7 +126,7 @@ class StatisticsLoggingTestCase extends DrupalWebTestCase {
);
$this->drupalGet($path);
$log = db_query('SELECT * FROM {accesslog}')->fetchAll(PDO::FETCH_ASSOC);
- $this->assertTrue(is_array($log) && count($log) == 7, t('Page request was logged.'));
+ $this->assertTrue(is_array($log) && count($log) == 7, 'Page request was logged.');
$this->assertEqual(array_intersect_key($log[6], $expected), $expected);
// Create a path longer than 255 characters.
@@ -158,9 +158,9 @@ class StatisticsReportsTestCase extends StatisticsTestCase {
*/
function testRecentHits() {
$this->drupalGet('admin/reports/hits');
- $this->assertText('test', t('Hit title found.'));
- $this->assertText('node/1', t('Hit URL found.'));
- $this->assertText('Anonymous', t('Hit user found.'));
+ $this->assertText('test', 'Hit title found.');
+ $this->assertText('node/1', 'Hit URL found.');
+ $this->assertText('Anonymous', 'Hit user found.');
}
/**
@@ -168,8 +168,8 @@ class StatisticsReportsTestCase extends StatisticsTestCase {
*/
function testTopPages() {
$this->drupalGet('admin/reports/pages');
- $this->assertText('test', t('Hit title found.'));
- $this->assertText('node/1', t('Hit URL found.'));
+ $this->assertText('test', 'Hit title found.');
+ $this->assertText('node/1', 'Hit URL found.');
}
/**
@@ -177,7 +177,7 @@ class StatisticsReportsTestCase extends StatisticsTestCase {
*/
function testTopReferrers() {
$this->drupalGet('admin/reports/referrers');
- $this->assertText('http://example.com', t('Hit referrer found.'));
+ $this->assertText('http://example.com', 'Hit referrer found.');
}
/**
@@ -185,9 +185,9 @@ class StatisticsReportsTestCase extends StatisticsTestCase {
*/
function testDetails() {
$this->drupalGet('admin/reports/access/1');
- $this->assertText('test', t('Hit title found.'));
- $this->assertText('node/1', t('Hit URL found.'));
- $this->assertText('Anonymous', t('Hit user found.'));
+ $this->assertText('test', 'Hit title found.');
+ $this->assertText('node/1', 'Hit URL found.');
+ $this->assertText('Anonymous', 'Hit user found.');
}
/**
@@ -196,8 +196,8 @@ class StatisticsReportsTestCase extends StatisticsTestCase {
function testAccessLogging() {
$this->drupalGet('admin/reports/referrers');
$this->drupalGet('admin/reports/hits');
- $this->assertText('Top referrers in the past 3 days', t('Hit title found.'));
- $this->assertText('admin/reports/referrers', t('Hit URL found.'));
+ $this->assertText('Top referrers in the past 3 days', 'Hit title found.');
+ $this->assertText('admin/reports/referrers', 'Hit URL found.');
}
/**
@@ -222,12 +222,12 @@ class StatisticsReportsTestCase extends StatisticsTestCase {
// Get some page and check if the block is displayed.
$this->drupalGet('user');
- $this->assertText('Popular content', t('Found the popular content block.'));
- $this->assertText("Today's", t('Found today\'s popular content.'));
- $this->assertText('All time', t('Found the alll time popular content.'));
- $this->assertText('Last viewed', t('Found the last viewed popular content.'));
+ $this->assertText('Popular content', 'Found the popular content block.');
+ $this->assertText("Today's", 'Found today\'s popular content.');
+ $this->assertText('All time', 'Found the alll time popular content.');
+ $this->assertText('Last viewed', 'Found the last viewed popular content.');
- $this->assertRaw(l($node->title, 'node/' . $node->nid), t('Found link to visited node.'));
+ $this->assertRaw(l($node->title, 'node/' . $node->nid), 'Found link to visited node.');
}
}
@@ -254,30 +254,30 @@ class StatisticsBlockVisitorsTestCase extends StatisticsTestCase {
// and that a 'block IP address' link is displayed.
$this->drupalLogin($this->blocking_user);
$this->drupalGet('admin/reports/visitors');
- $this->assertText($test_ip_address, t('IP address found.'));
- $this->assertText(t('block IP address'), t('Block IP link displayed'));
+ $this->assertText($test_ip_address, 'IP address found.');
+ $this->assertText(t('block IP address'), 'Block IP link displayed');
// Block the IP address.
$this->clickLink('block IP address');
- $this->assertText(t('IP address blocking'), t('IP blocking page displayed.'));
+ $this->assertText(t('IP address blocking'), 'IP blocking page displayed.');
$edit = array();
$edit['ip'] = $test_ip_address;
$this->drupalPost('admin/config/people/ip-blocking', $edit, t('Add'));
$ip = db_query("SELECT iid from {blocked_ips} WHERE ip = :ip", array(':ip' => $edit['ip']))->fetchField();
- $this->assertNotEqual($ip, FALSE, t('IP address found in database'));
- $this->assertRaw(t('The IP address %ip has been blocked.', array('%ip' => $edit['ip'])), t('IP address was blocked.'));
+ $this->assertNotEqual($ip, FALSE, 'IP address found in database');
+ $this->assertRaw(t('The IP address %ip has been blocked.', array('%ip' => $edit['ip'])), 'IP address was blocked.');
// Verify that the block/unblock link on the top visitors page has been
// altered.
$this->drupalGet('admin/reports/visitors');
- $this->assertText(t('unblock IP address'), t('Unblock IP address link displayed'));
+ $this->assertText(t('unblock IP address'), 'Unblock IP address link displayed');
// Unblock the IP address.
$this->clickLink('unblock IP address');
- $this->assertRaw(t('Are you sure you want to delete %ip?', array('%ip' => $test_ip_address)), t('IP address deletion confirmation found.'));
+ $this->assertRaw(t('Are you sure you want to delete %ip?', array('%ip' => $test_ip_address)), 'IP address deletion confirmation found.');
$edit = array();
$this->drupalPost('admin/config/people/ip-blocking/delete/1', NULL, t('Delete'));
- $this->assertRaw(t('The IP address %ip was deleted.', array('%ip' => $test_ip_address)), t('IP address deleted.'));
+ $this->assertRaw(t('The IP address %ip was deleted.', array('%ip' => $test_ip_address)), 'IP address deleted.');
}
}
@@ -321,32 +321,32 @@ class StatisticsAdminTestCase extends DrupalWebTestCase {
* Verifies that the statistics settings page works.
*/
function testStatisticsSettings() {
- $this->assertFalse(variable_get('statistics_enable_access_log', 0), t('Access log is disabled by default.'));
- $this->assertFalse(variable_get('statistics_count_content_views', 0), t('Count content view log is disabled by default.'));
+ $this->assertFalse(variable_get('statistics_enable_access_log', 0), 'Access log is disabled by default.');
+ $this->assertFalse(variable_get('statistics_count_content_views', 0), 'Count content view log is disabled by default.');
$this->drupalGet('admin/reports/pages');
- $this->assertRaw(t('No statistics available.'), t('Verifying text shown when no statistics is available.'));
+ $this->assertRaw(t('No statistics available.'), 'Verifying text shown when no statistics is available.');
// Enable access log and counter on content view.
$edit['statistics_enable_access_log'] = 1;
$edit['statistics_count_content_views'] = 1;
$this->drupalPost('admin/config/system/statistics', $edit, t('Save configuration'));
- $this->assertTrue(variable_get('statistics_enable_access_log'), t('Access log is enabled.'));
- $this->assertTrue(variable_get('statistics_count_content_views'), t('Count content view log is enabled.'));
+ $this->assertTrue(variable_get('statistics_enable_access_log'), 'Access log is enabled.');
+ $this->assertTrue(variable_get('statistics_count_content_views'), 'Count content view log is enabled.');
// Hit the node.
$this->drupalGet('node/' . $this->test_node->nid);
$this->drupalGet('admin/reports/pages');
- $this->assertText('node/1', t('Test node found.'));
+ $this->assertText('node/1', 'Test node found.');
// Hit the node again (the counter is incremented after the hit, so
// "1 read" will actually be shown when the node is hit the second time).
$this->drupalGet('node/' . $this->test_node->nid);
- $this->assertText('1 read', t('Node is read once.'));
+ $this->assertText('1 read', 'Node is read once.');
$this->drupalGet('node/' . $this->test_node->nid);
- $this->assertText('2 reads', t('Node is read 2 times.'));
+ $this->assertText('2 reads', 'Node is read 2 times.');
}
/**
@@ -395,10 +395,10 @@ class StatisticsAdminTestCase extends DrupalWebTestCase {
$this->drupalPost(NULL, NULL, t('Cancel account'));
// Confirm account cancellation request.
$this->drupalGet("user/$account->uid/cancel/confirm/$timestamp/" . user_pass_rehash($account->pass, $timestamp, $account->login));
- $this->assertFalse(user_load($account->uid, TRUE), t('User is not found in the database.'));
+ $this->assertFalse(user_load($account->uid, TRUE), 'User is not found in the database.');
$this->drupalGet('admin/reports/visitors');
- $this->assertNoText($account->name, t('Did not find user in visitor statistics.'));
+ $this->assertNoText($account->name, 'Did not find user in visitor statistics.');
}
/**
@@ -412,10 +412,10 @@ class StatisticsAdminTestCase extends DrupalWebTestCase {
$this->drupalGet('node/' . $this->test_node->nid);
$this->drupalGet('node/' . $this->test_node->nid);
- $this->assertText('1 read', t('Node is read once.'));
+ $this->assertText('1 read', 'Node is read once.');
$this->drupalGet('admin/reports/pages');
- $this->assertText('node/' . $this->test_node->nid, t('Hit URL found.'));
+ $this->assertText('node/' . $this->test_node->nid, 'Hit URL found.');
// statistics_cron will subtract the statistics_flush_accesslog_timer
// variable from REQUEST_TIME in the delete query, so wait two secs here to
@@ -424,14 +424,14 @@ class StatisticsAdminTestCase extends DrupalWebTestCase {
$this->cronRun();
$this->drupalGet('admin/reports/pages');
- $this->assertNoText('node/' . $this->test_node->nid, t('No hit URL found.'));
+ $this->assertNoText('node/' . $this->test_node->nid, 'No hit URL found.');
$result = db_select('node_counter', 'nc')
->fields('nc', array('daycount'))
->condition('nid', $this->test_node->nid, '=')
->execute()
->fetchField();
- $this->assertFalse($result, t('Daycounter is zero.'));
+ $this->assertFalse($result, 'Daycounter is zero.');
}
}
@@ -470,11 +470,11 @@ class StatisticsTokenReplaceTestCase extends StatisticsTestCase {
$tests['[node:last-view:short]'] = format_date($statistics['timestamp'], 'short');
// Test to make sure that we generated something for each token.
- $this->assertFalse(in_array(0, array_map('strlen', $tests)), t('No empty tokens generated.'));
+ $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
foreach ($tests as $input => $expected) {
$output = token_replace($input, array('node' => $node), array('language' => $language));
- $this->assertEqual($output, $expected, t('Statistics token %token replaced.', array('%token' => $input)));
+ $this->assertEqual($output, $expected, format_string('Statistics token %token replaced.', array('%token' => $input)));
}
}
}
diff --git a/modules/syslog/syslog.test b/modules/syslog/syslog.test
index 1f7ab2ea8..4707bd0df 100644
--- a/modules/syslog/syslog.test
+++ b/modules/syslog/syslog.test
@@ -37,7 +37,7 @@ class SyslogTestCase extends DrupalWebTestCase {
$this->drupalGet('admin/config/development/logging');
if ($this->parse()) {
$field = $this->xpath('//option[@value=:value]', array(':value' => LOG_LOCAL6)); // Should be one field.
- $this->assertTrue($field[0]['selected'] == 'selected', t('Facility value saved.'));
+ $this->assertTrue($field[0]['selected'] == 'selected', 'Facility value saved.');
}
}
}
diff --git a/modules/system/html.tpl.php b/modules/system/html.tpl.php
index 0e012774d..c3e24c946 100644
--- a/modules/system/html.tpl.php
+++ b/modules/system/html.tpl.php
@@ -39,6 +39,8 @@
* @see template_preprocess()
* @see template_preprocess_html()
* @see template_process()
+ *
+ * @ingroup themeable
*/
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN"
"http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
diff --git a/modules/system/maintenance-page.tpl.php b/modules/system/maintenance-page.tpl.php
index 31de3bb23..69d267f81 100644
--- a/modules/system/maintenance-page.tpl.php
+++ b/modules/system/maintenance-page.tpl.php
@@ -9,6 +9,8 @@
*
* @see template_preprocess()
* @see template_preprocess_maintenance_page()
+ *
+ * @ingroup themeable
*/
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
diff --git a/modules/system/page.tpl.php b/modules/system/page.tpl.php
index bd440afb2..bd61489e0 100644
--- a/modules/system/page.tpl.php
+++ b/modules/system/page.tpl.php
@@ -68,6 +68,8 @@
* @see template_preprocess_page()
* @see template_process()
* @see html.tpl.php
+ *
+ * @ingroup themeable
*/
?>
diff --git a/modules/system/region.tpl.php b/modules/system/region.tpl.php
index b29e24f01..deb8d3aed 100644
--- a/modules/system/region.tpl.php
+++ b/modules/system/region.tpl.php
@@ -24,6 +24,8 @@
* @see template_preprocess()
* @see template_preprocess_region()
* @see template_process()
+ *
+ * @ingroup themeable
*/
?>
<?php if ($content): ?>
diff --git a/modules/system/system.admin.inc b/modules/system/system.admin.inc
index 23a975b0c..061898c85 100644
--- a/modules/system/system.admin.inc
+++ b/modules/system/system.admin.inc
@@ -691,8 +691,16 @@ function _system_theme_settings_validate_path($path) {
* Process system_theme_settings form submissions.
*/
function system_theme_settings_submit($form, &$form_state) {
+ // Exclude unnecessary elements before saving.
+ form_state_values_clean($form_state);
+
$values = $form_state['values'];
+ // Extract the name of the theme from the submitted form values, then remove
+ // it from the array so that it is not saved as part of the variable.
+ $key = $values['var'];
+ unset($values['var']);
+
// If the user uploaded a new logo or favicon, save it to a permanent location
// and use it in place of the default theme-provided file.
if ($file = $values['logo_upload']) {
@@ -722,10 +730,7 @@ function system_theme_settings_submit($form, &$form_state) {
if (empty($values['default_favicon']) && !empty($values['favicon_path'])) {
$values['favicon_mimetype'] = file_get_mimetype($values['favicon_path']);
}
- $key = $values['var'];
- // Exclude unnecessary elements before saving.
- unset($values['var'], $values['submit'], $values['reset'], $values['form_id'], $values['op'], $values['form_build_id'], $values['form_token']);
variable_set($key, $values);
drupal_set_message(t('The configuration options have been saved.'));
@@ -808,7 +813,7 @@ function system_modules($form, $form_state = array()) {
// Used when checking if module implements a help page.
$help_arg = module_exists('help') ? drupal_help_arg() : FALSE;
- // Used when displaying modules that are required by the install profile.
+ // Used when displaying modules that are required by the installation profile.
require_once DRUPAL_ROOT . '/includes/install.inc';
$distribution_name = check_plain(drupal_install_profile_distribution_name());
@@ -1269,8 +1274,8 @@ function system_modules_uninstall($form, $form_state = NULL) {
'#title_display' => 'invisible',
);
// All modules which depend on this one must be uninstalled first, before
- // we can allow this module to be uninstalled. (The install profile is
- // excluded from this list.)
+ // we can allow this module to be uninstalled. (The installation profile
+ // is excluded from this list.)
foreach (array_keys($module->required_by) as $dependent) {
if ($dependent != $profile && drupal_get_installed_schema_version($dependent) != SCHEMA_UNINSTALLED) {
$dependent_name = isset($all_modules[$dependent]->info['name']) ? $all_modules[$dependent]->info['name'] : $dependent;
diff --git a/modules/system/system.api.php b/modules/system/system.api.php
index 79ac8f169..53d3cb282 100644
--- a/modules/system/system.api.php
+++ b/modules/system/system.api.php
@@ -85,8 +85,8 @@ function hook_hook_info_alter(&$hooks) {
* - load hook: The name of the hook which should be invoked by
* DrupalDefaultEntityController:attachLoad(), for example 'node_load'.
* - uri callback: A function taking an entity as argument and returning the
- * uri elements of the entity, e.g. 'path' and 'options'. The actual entity
- * uri can be constructed by passing these elements to url().
+ * URI elements of the entity, e.g. 'path' and 'options'. The actual entity
+ * URI can be constructed by passing these elements to url().
* - label callback: (optional) A function taking an entity and an entity type
* as arguments and returning the label of the entity. The entity label is
* the main string associated with an entity; for example, the title of a
@@ -466,6 +466,24 @@ function hook_entity_view_alter(&$build, $type) {
}
/**
+ * Change the view mode of an entity that is being displayed.
+ *
+ * @param string $view_mode
+ * The view_mode that is to be used to display the entity.
+ * @param array $context
+ * Array with contextual information, including:
+ * - entity_type: The type of the entity that is being viewed.
+ * - entity: The entity object.
+ * - langcode: The langcode the entity is being viewed in.
+ */
+function hook_entity_view_mode_alter(&$view_mode, $context) {
+ // For nodes, change the view mode when it is teaser.
+ if ($context['entity_type'] == 'node' && $view_mode == 'teaser') {
+ $view_mode = 'my_custom_view_mode';
+ }
+}
+
+/**
* Define administrative paths.
*
* Modules may specify whether or not the paths they define in hook_menu() are
@@ -623,7 +641,7 @@ function hook_cron_queue_info_alter(&$queues) {
}
/**
- * Allows modules to declare their own Forms API element types and specify their
+ * Allows modules to declare their own Form API element types and specify their
* default values.
*
* This hook allows modules to declare their own form element types and to
@@ -689,7 +707,8 @@ function hook_element_info_alter(&$type) {
* Perform cleanup tasks.
*
* This hook is run at the end of each page request. It is often used for
- * page logging and specialized cleanup. This hook MUST NOT print anything.
+ * page logging and specialized cleanup. This hook MUST NOT print anything
+ * because by the time it runs the response is already sent to the browser.
*
* Only use this hook if your code must run even for cached page views.
* If you have code which must run once on all non-cached pages, use
@@ -1040,7 +1059,7 @@ function hook_menu_get_item_alter(&$router_item, $path, $original_map) {
* This 'abc' object will then be passed into the callback functions defined
* for the menu item, such as the page callback function mymodule_abc_edit()
* to replace the integer 1 in the argument array. Note that a load function
- * should return FALSE when it is unable to provide a loadable object. For
+ * should return FALSE when it is unable to provide a loadable object. For
* example, the node_load() function for the 'node/%node/edit' menu item will
* return FALSE for the path 'node/999/edit' if a node with a node ID of 999
* does not exist. The menu routing system will return a 404 error in this case.
@@ -1632,6 +1651,7 @@ function hook_page_alter(&$page) {
*
* @see hook_form_BASE_FORM_ID_alter()
* @see hook_form_FORM_ID_alter()
+ * @see forms_api_reference.html
*/
function hook_form_alter(&$form, &$form_state, $form_id) {
if (isset($form['type']) && $form['type']['#value'] . '_node_settings' == $form_id) {
@@ -1668,6 +1688,7 @@ function hook_form_alter(&$form, &$form_state, $form_id) {
* @see hook_form_alter()
* @see hook_form_BASE_FORM_ID_alter()
* @see drupal_prepare_form()
+ * @see forms_api_reference.html
*/
function hook_form_FORM_ID_alter(&$form, &$form_state, $form_id) {
// Modification for the form with the given form ID goes here. For example, if
@@ -1959,7 +1980,7 @@ function hook_mail_alter(&$message) {
* purposes of hook_module_implements_alter(), these variants are treated as
* a single hook. Thus, to ensure that your implementation of
* hook_form_FORM_ID_alter() is called at the right time, you will have to
- * have to change the order of hook_form_alter() implementation in
+ * change the order of hook_form_alter() implementation in
* hook_module_implements_alter().
*
* @param $implementations
@@ -2983,7 +3004,7 @@ function hook_file_url_alter(&$uri) {
*/
function hook_requirements($phase) {
$requirements = array();
- // Ensure translations don't break at install time
+ // Ensure translations don't break during installation.
$t = get_t();
// Report Drupal version
@@ -3035,7 +3056,7 @@ function hook_requirements($phase) {
* more tables and their related keys and indexes. A schema is defined by
* hook_schema() which must live in your module's .install file.
*
- * This hook is called at both install and uninstall time, and in the latter
+ * This hook is called at install and uninstall time, and in the latter
* case, it cannot rely on the .module file being loaded or hooks being known.
* If the .module file is needed, it may be loaded with drupal_load().
*
@@ -3284,6 +3305,17 @@ function hook_install() {
* the same directory as mymodule.module. Drupal core's updates are implemented
* using the system module as a name and stored in database/updates.inc.
*
+ * Not all module functions are available from within a hook_update_N() function.
+ * In order to call a function from your mymodule.module or an include file,
+ * you need to explicitly load that file first.
+ *
+ * During database updates the schema of any module could be out of date. For
+ * this reason, caution is needed when using any API function within an update
+ * function - particularly CRUD functions, functions that depend on the schema
+ * (for example by using drupal_write_record()), and any functions that invoke
+ * hooks. See @link update_api Update versions of API functions @endlink for
+ * details.
+ *
* If your update task is potentially time-consuming, you'll need to implement a
* multipass update to avoid PHP timeouts. Multipass updates use the $sandbox
* parameter provided by the batch API (normally, $context['sandbox']) to store
@@ -3308,6 +3340,7 @@ function hook_install() {
*
* @see batch
* @see schemaapi
+ * @see update_api
* @see hook_update_last_removed()
* @see update_get_update_list()
*/
@@ -3735,7 +3768,7 @@ function hook_drupal_goto_alter(&$path, &$options, &$http_response_code) {
function hook_html_head_alter(&$head_elements) {
foreach ($head_elements as $key => $element) {
if (isset($element['#attributes']['rel']) && $element['#attributes']['rel'] == 'canonical') {
- // I want a custom canonical url.
+ // I want a custom canonical URL.
$head_elements[$key]['#attributes']['href'] = mymodule_canonical_url();
}
}
@@ -4631,3 +4664,114 @@ function hook_filetransfer_info_alter(&$filetransfer_info) {
/**
* @} End of "addtogroup hooks".
*/
+
+/**
+ * @defgroup update_api Update versions of API functions
+ * @{
+ * Functions that are similar to normal API functions, but do not invoke hooks.
+ *
+ * These simplified versions of core API functions are provided for use by
+ * update functions (hook_update_N() implementations).
+ *
+ * During database updates the schema of any module could be out of date. For
+ * this reason, caution is needed when using any API function within an update
+ * function - particularly CRUD functions, functions that depend on the schema
+ * (for example by using drupal_write_record()), and any functions that invoke
+ * hooks.
+ *
+ * Instead, a simplified utility function should be used. If a utility version
+ * of the API function you require does not already exist, then you should
+ * create a new function. The new utility function should be named
+ * _update_N_mymodule_my_function(). N is the schema version the function acts
+ * on (the schema version is the number N from the hook_update_N()
+ * implementation where this schema was introduced, or a number following the
+ * same numbering scheme), and mymodule_my_function is the name of the original
+ * API function including the module's name.
+ *
+ * Examples:
+ * - _update_6000_mymodule_save(): This function performs a save operation
+ * without invoking any hooks using the 6.x schema.
+ * - _update_7000_mymodule_save(): This function performs the same save
+ * operation using the 7.x schema.
+ *
+ * The utility function should not invoke any hooks, and should perform database
+ * operations using functions from the
+ * @link database Database abstraction layer, @endlink
+ * like db_insert(), db_update(), db_delete(), db_query(), and so on.
+ *
+ * If a change to the schema necessitates a change to the utility function, a
+ * new function should be created with a name based on the version of the schema
+ * it acts on. See _update_7000_bar_get_types() and _update_7001_bar_get_types()
+ * in the code examples that follow.
+ *
+ * For example, foo.install could contain:
+ * @code
+ * function foo_update_dependencies() {
+ * // foo_update_7010() needs to run after bar_update_7000().
+ * $dependencies['foo'][7010] = array(
+ * 'bar' => 7000,
+ * );
+ *
+ * // foo_update_7036() needs to run after bar_update_7001().
+ * $dependencies['foo'][7036] = array(
+ * 'bar' => 7001,
+ * );
+ *
+ * return $dependencies;
+ * }
+ *
+ * function foo_update_7000() {
+ * // No updates have been run on the {bar_types} table yet, so this needs
+ * // to work with the 6.x schema.
+ * foreach (_update_6000_bar_get_types() as $type) {
+ * // Rename a variable.
+ * }
+ * }
+ *
+ * function foo_update_7010() {
+ * // Since foo_update_7010() is going to run after bar_update_7000(), it
+ * // needs to operate on the new schema, not the old one.
+ * foreach (_update_7000_bar_get_types() as $type) {
+ * // Rename a different variable.
+ * }
+ * }
+ *
+ * function foo_update_7036() {
+ * // This update will run after bar_update_7001().
+ * foreach (_update_7001_bar_get_types() as $type) {
+ * }
+ * }
+ * @endcode
+ *
+ * And bar.install could contain:
+ * @code
+ * function bar_update_7000() {
+ * // Type and bundle are confusing, so we renamed the table.
+ * db_rename_table('bar_types', 'bar_bundles');
+ * }
+ *
+ * function bar_update_7001() {
+ * // Database table names should be singular when possible.
+ * db_rename_table('bar_bundles', 'bar_bundle');
+ * }
+ *
+ * function _update_6000_bar_get_types() {
+ * db_query('SELECT * FROM {bar_types}')->fetchAll();
+ * }
+ *
+ * function _update_7000_bar_get_types() {
+ * db_query('SELECT * FROM {bar_bundles'})->fetchAll();
+ * }
+ *
+ * function _update_7001_bar_get_types() {
+ * db_query('SELECT * FROM {bar_bundle}')->fetchAll();
+ * }
+ * @endcode
+ *
+ * @see hook_update_N()
+ * @see hook_update_dependencies()
+ */
+
+/**
+ * @} End of "defgroup update_api".
+ */
diff --git a/modules/system/system.base.css b/modules/system/system.base.css
index 65383dd34..412b18a82 100644
--- a/modules/system/system.base.css
+++ b/modules/system/system.base.css
@@ -231,6 +231,8 @@ html.js .js-hide {
position: absolute !important;
clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
clip: rect(1px, 1px, 1px, 1px);
+ overflow: hidden;
+ height: 1px;
}
/**
@@ -241,6 +243,8 @@ html.js .js-hide {
.element-invisible.element-focusable:focus {
position: static !important;
clip: auto;
+ overflow: visible;
+ height: auto;
}
/**
diff --git a/modules/system/system.install b/modules/system/system.install
index 1161d6cdd..df0db710c 100644
--- a/modules/system/system.install
+++ b/modules/system/system.install
@@ -16,7 +16,7 @@
function system_requirements($phase) {
global $base_url;
$requirements = array();
- // Ensure translations don't break at install time
+ // Ensure translations don't break during installation.
$t = get_t();
// Report Drupal version
@@ -28,8 +28,8 @@ function system_requirements($phase) {
'weight' => -10,
);
- // Display the currently active install profile, if the site
- // is not running the default install profile.
+ // Display the currently active installation profile, if the site
+ // is not running the default installation profile.
$profile = drupal_get_profile();
if ($profile != 'standard') {
$info = system_get_info('module', $profile);
@@ -308,7 +308,7 @@ function system_requirements($phase) {
variable_get('file_private_path', FALSE),
);
- // Do not check for the temporary files directory at install time
+ // Do not check for the temporary files directory during installation
// unless it has been set in settings.php. In this case the user has
// no alternative but to fix the directory if it is not writable.
if ($phase == 'install') {
@@ -412,7 +412,7 @@ function system_requirements($phase) {
$profile = drupal_get_profile();
$files = system_rebuild_module_data();
foreach ($files as $module => $file) {
- // Ignore disabled modules and install profiles.
+ // Ignore disabled modules and installation profiles.
if (!$file->status || $module == $profile) {
continue;
}
@@ -810,7 +810,6 @@ function system_schema() {
'length' => 255,
'not null' => TRUE,
'default' => '',
- 'binary' => TRUE,
),
'uri' => array(
'description' => 'The URI to access the file (either local or remote).',
@@ -1711,17 +1710,18 @@ function system_update_dependencies() {
function system_update_7000() {
$result = db_query("SELECT rid, perm FROM {permission} ORDER BY rid");
foreach ($result as $role) {
- $renamed_permission = preg_replace('/(?<=^|,\ )create\ blog\ entries(?=,|$)/', 'create blog content', $role->perm);
- $renamed_permission = preg_replace('/(?<=^|,\ )edit\ own\ blog\ entries(?=,|$)/', 'edit own blog content', $role->perm);
- $renamed_permission = preg_replace('/(?<=^|,\ )edit\ any\ blog\ entry(?=,|$)/', 'edit any blog content', $role->perm);
- $renamed_permission = preg_replace('/(?<=^|,\ )delete\ own\ blog\ entries(?=,|$)/', 'delete own blog content', $role->perm);
- $renamed_permission = preg_replace('/(?<=^|,\ )delete\ any\ blog\ entry(?=,|$)/', 'delete any blog content', $role->perm);
-
- $renamed_permission = preg_replace('/(?<=^|,\ )create\ forum\ topics(?=,|$)/', 'create forum content', $role->perm);
- $renamed_permission = preg_replace('/(?<=^|,\ )delete\ any\ forum\ topic(?=,|$)/', 'delete any forum content', $role->perm);
- $renamed_permission = preg_replace('/(?<=^|,\ )delete\ own\ forum\ topics(?=,|$)/', 'delete own forum content', $role->perm);
- $renamed_permission = preg_replace('/(?<=^|,\ )edit\ any\ forum\ topic(?=,|$)/', 'edit any forum content', $role->perm);
- $renamed_permission = preg_replace('/(?<=^|,\ )edit\ own\ forum\ topics(?=,|$)/', 'edit own forum content', $role->perm);
+ $renamed_permission = $role->perm;
+ $renamed_permission = preg_replace('/(?<=^|,\ )create\ blog\ entries(?=,|$)/', 'create blog content', $renamed_permission);
+ $renamed_permission = preg_replace('/(?<=^|,\ )edit\ own\ blog\ entries(?=,|$)/', 'edit own blog content', $renamed_permission);
+ $renamed_permission = preg_replace('/(?<=^|,\ )edit\ any\ blog\ entry(?=,|$)/', 'edit any blog content', $renamed_permission);
+ $renamed_permission = preg_replace('/(?<=^|,\ )delete\ own\ blog\ entries(?=,|$)/', 'delete own blog content', $renamed_permission);
+ $renamed_permission = preg_replace('/(?<=^|,\ )delete\ any\ blog\ entry(?=,|$)/', 'delete any blog content', $renamed_permission);
+
+ $renamed_permission = preg_replace('/(?<=^|,\ )create\ forum\ topics(?=,|$)/', 'create forum content', $renamed_permission);
+ $renamed_permission = preg_replace('/(?<=^|,\ )delete\ any\ forum\ topic(?=,|$)/', 'delete any forum content', $renamed_permission);
+ $renamed_permission = preg_replace('/(?<=^|,\ )delete\ own\ forum\ topics(?=,|$)/', 'delete own forum content', $renamed_permission);
+ $renamed_permission = preg_replace('/(?<=^|,\ )edit\ any\ forum\ topic(?=,|$)/', 'edit any forum content', $renamed_permission);
+ $renamed_permission = preg_replace('/(?<=^|,\ )edit\ own\ forum\ topics(?=,|$)/', 'edit own forum content', $renamed_permission);
if ($renamed_permission != $role->perm) {
db_update('permission')
@@ -2793,7 +2793,7 @@ function system_update_7061(&$sandbox) {
$scheme = file_default_scheme() . '://';
foreach ($node_revisions as $vid => $revision) {
foreach ($revision['file'][LANGUAGE_NONE] as $delta => $file) {
- // We will convert filepaths to uri using the default scheme
+ // We will convert filepaths to URI using the default scheme
// and stripping off the existing file directory path.
$file['uri'] = $scheme . preg_replace('!^' . preg_quote($basename) . '!', '', $file['filepath']);
$file['uri'] = file_stream_wrapper_uri_normalize($file['uri']);
@@ -2958,8 +2958,9 @@ function system_update_7069() {
*/
/**
- * @defgroup updates-7.x-extra Extra system updates for 7.x
+ * @defgroup updates-7.x-extra Extra updates for 7.x
* @{
+ * Update functions between 7.x versions.
*/
/**
@@ -3025,6 +3026,67 @@ function system_update_7074() {
}
/**
+ * Fix renamed queries from system_update_7000().
+ */
+function system_update_7075() {
+ $permission_changes = array(
+ 'create blog entries' => 'create blog content',
+ 'edit own blog entries' => 'edit own blog content',
+ 'edit any blog entry' => 'edit any blog content',
+ 'delete own blog entries' => 'delete own blog content',
+ 'delete any blog entry' => 'delete any blog content',
+
+ 'create forum topics' => 'create forum content',
+ 'edit own forum topics' => 'edit own forum content',
+ 'edit any forum topic' => 'edit any forum content',
+ 'delete own forum topics' => 'delete own forum content',
+ 'delete any forum topic' => 'delete any forum content',
+ );
+
+ foreach ($permission_changes as $permission_key => $permission_change) {
+ db_update('role_permission')
+ ->fields(array('permission' => $permission_change))
+ ->condition('permission', $permission_key)
+ ->execute();
+ }
+}
+
+/**
+ * Convert menu_links query strings into arrays.
+ */
+function system_update_7076() {
+ $query = db_select('menu_links', 'ml', array('fetch' => PDO::FETCH_ASSOC))
+ ->fields('ml', array('mlid', 'options'));
+ foreach ($query->execute() as $menu_link) {
+ if (strpos($menu_link['options'], 'query') !== FALSE) {
+ $menu_link['options'] = unserialize($menu_link['options']);
+ if (isset($menu_link['options']['query']) && is_string($menu_link['options']['query'])) {
+ $menu_link['options']['query'] = drupal_get_query_array($menu_link['options']['query']);
+ db_update('menu_links')
+ ->fields(array(
+ 'options' => serialize($menu_link['options']),
+ ))
+ ->condition('mlid', $menu_link['mlid'], '=')
+ ->execute();
+ }
+ }
+ }
+}
+
+/**
+ * Revert {file_managed}.filename changed to a binary column.
+ */
+function system_update_7077() {
+ db_change_field('file_managed', 'filename', 'filename', array(
+ 'description' => 'Name of the file with no path components. This may differ from the basename of the URI if the file is renamed to avoid overwriting an existing file.',
+ 'type' => 'varchar',
+ 'length' => 255,
+ 'not null' => TRUE,
+ 'default' => '',
+ ));
+}
+
+/**
* @} End of "defgroup updates-7.x-extra".
* The next series of updates should start at 8000.
*/
diff --git a/modules/system/system.module b/modules/system/system.module
index 9897fb25e..a8fb53fa6 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -1785,11 +1785,11 @@ function system_authorized_init($callback, $file, $arguments = array(), $page_ti
* @param array $options
* Optional array of options to pass to url().
* @return
- * The full URL to authorize.php, using https if available.
+ * The full URL to authorize.php, using HTTPS if available.
*/
function system_authorized_get_url(array $options = array()) {
global $base_url;
- // Force https if available, regardless of what the caller specifies.
+ // Force HTTPS if available, regardless of what the caller specifies.
$options['https'] = TRUE;
// We prefix with $base_url so we get a full path even if clean URLs are
// disabled.
@@ -2348,14 +2348,14 @@ function _system_rebuild_module_data() {
// Find modules
$modules = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.module$/', 'modules', 'name', 0);
- // Include the install profile in modules that are loaded.
+ // Include the installation profile in modules that are loaded.
$profile = drupal_get_profile();
$modules[$profile] = new stdClass();
$modules[$profile]->name = $profile;
$modules[$profile]->uri = 'profiles/' . $profile . '/' . $profile . '.profile';
$modules[$profile]->filename = $profile . '.profile';
- // Install profile hooks are always executed last.
+ // Installation profile hooks are always executed last.
$modules[$profile]->weight = 1000;
// Set defaults for module info.
@@ -2396,7 +2396,7 @@ function _system_rebuild_module_data() {
$module->info['scripts'] = _system_info_add_path($module->info['scripts'], $path);
}
- // Install profiles are hidden by default, unless explicitly specified
+ // Installation profiles are hidden by default, unless explicitly specified
// otherwise in the .info file.
if ($key == $profile && !isset($modules[$key]->info['hidden'])) {
$modules[$key]->info['hidden'] = TRUE;
@@ -2409,7 +2409,7 @@ function _system_rebuild_module_data() {
}
if (isset($modules[$profile])) {
- // The install profile is required, if it's a valid module.
+ // The installation profile is required, if it's a valid module.
$modules[$profile]->info['required'] = TRUE;
// Add a default distribution name if the profile did not provide one. This
// matches the default value used in install_profile_info().
@@ -3759,7 +3759,7 @@ function _system_date_formats_build() {
}
// Get custom formats added to the database by the end user.
- $result = db_query('SELECT df.dfid, df.format, df.type, df.locked, dfl.language FROM {date_formats} df LEFT JOIN {date_format_type} dft ON df.type = dft.type LEFT JOIN {date_format_locale} dfl ON df.format = dfl.format AND df.type = dfl.type ORDER BY df.type, df.format');
+ $result = db_query('SELECT df.dfid, df.format, df.type, df.locked, dfl.language FROM {date_formats} df LEFT JOIN {date_format_locale} dfl ON df.format = dfl.format AND df.type = dfl.type ORDER BY df.type, df.format');
foreach ($result as $record) {
// If this date type isn't set, initialise the array.
if (!isset($date_formats[$record->type])) {
diff --git a/modules/system/theme.api.php b/modules/system/theme.api.php
index cd7ecfde8..6865421cf 100644
--- a/modules/system/theme.api.php
+++ b/modules/system/theme.api.php
@@ -70,8 +70,8 @@
* Allow themes to alter the theme-specific settings form.
*
* With this hook, themes can alter the theme-specific settings form in any way
- * allowable by Drupal's Forms API, such as adding form elements, changing
- * default values and removing form elements. See the Forms API documentation on
+ * allowable by Drupal's Form API, such as adding form elements, changing
+ * default values and removing form elements. See the Form API documentation on
* api.drupal.org for detailed information.
*
* Note that the base theme's form alterations will be run before any sub-theme
diff --git a/modules/taxonomy/taxonomy-term.tpl.php b/modules/taxonomy/taxonomy-term.tpl.php
index b1ff20e3c..d410d1ef3 100644
--- a/modules/taxonomy/taxonomy-term.tpl.php
+++ b/modules/taxonomy/taxonomy-term.tpl.php
@@ -11,7 +11,7 @@
* such as render($content['field_example']). Use
* hide($content['field_example']) to temporarily suppress the printing of a
* given element.
- * - $term_url: Direct url of the current term.
+ * - $term_url: Direct URL of the current term.
* - $term_name: Name of the current term.
* - $classes: String of classes that can be used to style contextually through
* CSS. It can be manipulated through the variable $classes_array from
@@ -36,6 +36,8 @@
* @see template_preprocess()
* @see template_preprocess_taxonomy_term()
* @see template_process()
+ *
+ * @ingroup themeable
*/
?>
<div id="taxonomy-term-<?php print $term->tid; ?>" class="<?php print $classes; ?>">
diff --git a/modules/taxonomy/taxonomy.api.php b/modules/taxonomy/taxonomy.api.php
index cb778c9a7..10575c575 100644
--- a/modules/taxonomy/taxonomy.api.php
+++ b/modules/taxonomy/taxonomy.api.php
@@ -182,6 +182,30 @@ function hook_taxonomy_term_delete($term) {
}
/**
+ * Act on a taxonomy term that is being assembled before rendering.
+ *
+ * The module may add elements to $term->content prior to rendering. This hook
+ * will be called after hook_view(). The structure of $term->content is a
+ * renderable array as expected by drupal_render().
+ *
+ * @param $term
+ * The term that is being assembled for rendering.
+ * @param $view_mode
+ * The $view_mode parameter from taxonomy_term_view().
+ * @param $langcode
+ * The language code used for rendering.
+ *
+ * @see hook_entity_view()
+ */
+function hook_taxonomy_term_view($term, $view_mode, $langcode) {
+ $term->content['my_additional_field'] = array(
+ '#markup' => $additional_field,
+ '#weight' => 10,
+ '#theme' => 'mymodule_my_additional_field',
+ );
+}
+
+/**
* Alter the results of taxonomy_term_view().
*
* This hook is called after the content has been assembled in a structured
diff --git a/modules/taxonomy/taxonomy.install b/modules/taxonomy/taxonomy.install
index 711a0f983..c353c9c8c 100644
--- a/modules/taxonomy/taxonomy.install
+++ b/modules/taxonomy/taxonomy.install
@@ -266,7 +266,7 @@ function taxonomy_update_dependencies() {
*
* This function is valid for a database schema version 7002.
*
- * @ingroup update-api-6.x-to-7.x
+ * @ingroup update_api
*/
function _update_7002_taxonomy_get_vocabularies() {
return db_query('SELECT v.* FROM {taxonomy_vocabulary} v ORDER BY v.weight, v.name')->fetchAllAssoc('vid', PDO::FETCH_OBJ);
diff --git a/modules/taxonomy/taxonomy.module b/modules/taxonomy/taxonomy.module
index d501282fe..dc3cf44bc 100644
--- a/modules/taxonomy/taxonomy.module
+++ b/modules/taxonomy/taxonomy.module
@@ -140,7 +140,7 @@ function taxonomy_entity_info() {
}
/**
- * Entity uri callback.
+ * Entity URI callback.
*/
function taxonomy_term_uri($term) {
return array(
@@ -323,8 +323,8 @@ function taxonomy_menu() {
);
$items['admin/structure/taxonomy/%taxonomy_vocabulary_machine_name'] = array(
- 'title callback' => 'taxonomy_admin_vocabulary_title_callback',
- 'title arguments' => array(3),
+ 'title callback' => 'entity_label',
+ 'title arguments' => array('taxonomy_vocabulary', 3),
'page callback' => 'drupal_get_form',
'page arguments' => array('taxonomy_overview_terms', 3),
'access arguments' => array('administer taxonomy'),
@@ -375,7 +375,13 @@ function taxonomy_term_edit_access($term) {
}
/**
- * Return the vocabulary name given the vocabulary object.
+ * Returns the sanitized name of a vocabulary.
+ *
+ * Deprecated. This function was previously used as a menu item title callback
+ * but has been replaced by using entity_label() (which does not
+ * sanitize the title, since the menu system does that automatically). In
+ * Drupal 7, use that function for title callbacks, and call check_plain()
+ * directly if you need a sanitized title.
*/
function taxonomy_admin_vocabulary_title_callback($vocabulary) {
return check_plain($vocabulary->name);
@@ -386,7 +392,8 @@ function taxonomy_admin_vocabulary_title_callback($vocabulary) {
*
* @param $vocabulary
* A vocabulary object with the following properties:
- * - vid: The ID of the vocabulary.
+ * - vid: (optional) The ID of the vocabulary (omit if creating a new
+ * vocabulary; only use to update an existing vocabulary).
* - name: The human-readable name of the vocabulary.
* - machine_name: The machine name of the vocabulary.
* - description: (optional) The vocabulary's description.
@@ -401,7 +408,7 @@ function taxonomy_admin_vocabulary_title_callback($vocabulary) {
*
* @return
* Status constant indicating whether the vocabulary was inserted (SAVED_NEW)
- * or updated(SAVED_UPDATED).
+ * or updated (SAVED_UPDATED).
*/
function taxonomy_vocabulary_save($vocabulary) {
// Prevent leading and trailing spaces in vocabulary names.
@@ -736,6 +743,102 @@ function taxonomy_term_delete($tid) {
}
/**
+ * Generates an array which displays a term detail page.
+ *
+ * @param term
+ * A taxonomy term object.
+ * @return
+ * A $page element suitable for use by drupal_page_render().
+ */
+function taxonomy_term_show($term) {
+ return taxonomy_term_view_multiple(array($term->tid => $term), 'full');
+}
+
+/**
+ * Constructs a drupal_render() style array from an array of loaded terms.
+ *
+ * @param $terms
+ * An array of taxonomy terms as returned by taxonomy_term_load_multiple().
+ * @param $view_mode
+ * View mode, e.g. 'full', 'teaser'...
+ * @param $weight
+ * An integer representing the weight of the first node in the list.
+ * @param $langcode
+ * (optional) A language code to use for rendering. Defaults to the global
+ * content language of the current request.
+ *
+ * @return
+ * An array in the format expected by drupal_render().
+ */
+function taxonomy_term_view_multiple($terms, $view_mode = 'teaser', $weight = 0, $langcode = NULL) {
+ field_attach_prepare_view('taxonomy_term', $terms, $view_mode, $langcode);
+ entity_prepare_view('taxonomy_term', $terms, $langcode);
+ $build = array();
+ foreach ($terms as $term) {
+ $build['taxonomy_terms'][$term->tid] = taxonomy_term_view($term, $view_mode, $langcode);
+ $build['taxonomy_terms'][$term->tid]['#weight'] = $weight;
+ $weight++;
+ }
+ $build['taxonomy_terms']['#sorted'] = TRUE;
+ return $build;
+}
+
+/**
+ * Builds a structured array representing the term's content.
+ *
+ * The content built for the taxonomy term (field values, file attachments or
+ * other term components) will vary depending on the $view_mode parameter.
+ *
+ * Drupal core defines the following view modes for terms, with the following
+ * default use cases:
+ * - full (default): term is displayed on its own page (taxonomy/term/123)
+ * Contributed modules might define additional view modes, or use existing
+ * view modes in additional contexts.
+ *
+ * @param $term
+ * A taxonomy term object.
+ * @param $view_mode
+ * View mode, e.g. 'full', 'teaser'...
+ * @param $langcode
+ * (optional) A language code to use for rendering. Defaults to the global
+ * content language of the current request.
+ */
+function taxonomy_term_build_content($term, $view_mode = 'full', $langcode = NULL) {
+ if (!isset($langcode)) {
+ $langcode = $GLOBALS['language_content']->language;
+ }
+
+ // Remove previously built content, if exists.
+ $term->content = array();
+
+ // Try to add in the core taxonomy pieces like description and nodes.
+ $type = 'taxonomy_term';
+ $entity_ids = entity_extract_ids($type, $term);
+ $settings = field_view_mode_settings($type, $entity_ids[2]);
+ $fields = field_extra_fields_get_display($type, $entity_ids[2], $view_mode);
+ if (!empty($term->description) && isset($fields['description']) && $fields['description']['visible']) {
+ $term->content['description'] = array(
+ '#markup' => check_markup($term->description, $term->format, '', TRUE),
+ '#weight' => $fields['description']['weight'],
+ '#prefix' => '<div class="taxonomy-term-description">',
+ '#suffix' => '</div>',
+ );
+ }
+
+ // Build fields content.
+ // In case of a multiple view, taxonomy_term_view_multiple() already ran the
+ // 'prepare_view' step. An internal flag prevents the operation from running
+ // twice.
+ field_attach_prepare_view('taxonomy_term', array($term->tid => $term), $view_mode, $langcode);
+ entity_prepare_view('taxonomy_term', array($term->tid => $term), $langcode);
+ $term->content += field_attach_view('taxonomy_term', $term, $view_mode, $langcode);
+
+ // Allow modules to make their own additions to the taxonomy term.
+ module_invoke_all('taxonomy_term_view', $term, $view_mode, $langcode);
+ module_invoke_all('entity_view', $term, 'taxonomy_term', $view_mode, $langcode);
+}
+
+/**
* Generate an array for rendering the given term.
*
* @param $term
@@ -754,31 +857,31 @@ function taxonomy_term_view($term, $view_mode = 'full', $langcode = NULL) {
$langcode = $GLOBALS['language_content']->language;
}
- field_attach_prepare_view('taxonomy_term', array($term->tid => $term), $view_mode, $langcode);
- entity_prepare_view('taxonomy_term', array($term->tid => $term), $langcode);
+ // Allow modules to change the view mode.
+ $context = array(
+ 'entity_type' => 'taxonomy_term',
+ 'entity' => $term,
+ 'langcode' => $langcode,
+ );
+ drupal_alter('entity_view_mode', $view_mode, $context);
+
+ // Populate $node->content with a render() array.
+ taxonomy_term_build_content($term, $view_mode, $langcode);
+ $build = $term->content;
+
+ // We don't need duplicate rendering info in $term->content.
+ unset($term->content);
- $build = array(
+ $build += array(
'#theme' => 'taxonomy_term',
'#term' => $term,
'#view_mode' => $view_mode,
'#language' => $langcode,
);
- $build += field_attach_view('taxonomy_term', $term, $view_mode, $langcode);
-
- // Add term description if the term has one.
- if (!empty($term->description)) {
- $build['description'] = array(
- '#markup' => check_markup($term->description, $term->format, '', TRUE),
- '#weight' => 0,
- '#prefix' => '<div class="taxonomy-term-description">',
- '#suffix' => '</div>',
- );
- }
-
$build['#attached']['css'][] = drupal_get_path('module', 'taxonomy') . '/taxonomy.css';
- // Allow modules to modify the structured term.
+ // Allow modules to modify the structured taxonomy term.
$type = 'taxonomy_term';
drupal_alter(array('taxonomy_term_view', 'entity_view'), $build, $type);
@@ -1000,8 +1103,8 @@ function taxonomy_get_tree($vid, $parent = 0, $max_depth = NULL, $load_entities
$parents = &drupal_static(__FUNCTION__ . ':parents', array());
$terms = &drupal_static(__FUNCTION__ . ':terms', array());
- // We cache trees, so it's not CPU-intensive to call get_tree() on a term
- // and its children, too.
+ // We cache trees, so it's not CPU-intensive to call taxonomy_get_tree() on a
+ // term and its children, too.
if (!isset($children[$vid])) {
$children[$vid] = array();
$parents[$vid] = array();
@@ -1914,7 +2017,7 @@ function taxonomy_taxonomy_term_delete($term) {
* Converts EntityFieldQuery instances on taxonomy terms that have an entity
* condition on term bundles (vocabulary machine names). Since the vocabulary
* machine name is not present in the {taxonomy_term_data} table itself, we have
- * to convert the bundle condition into a proprety condition of vocabulary IDs
+ * to convert the bundle condition into a property condition of vocabulary IDs
* to match against {taxonomy_term_data}.vid.
*/
function taxonomy_entity_query_alter($query) {
diff --git a/modules/taxonomy/taxonomy.pages.inc b/modules/taxonomy/taxonomy.pages.inc
index 501ebbe10..4d2c4e6fc 100644
--- a/modules/taxonomy/taxonomy.pages.inc
+++ b/modules/taxonomy/taxonomy.pages.inc
@@ -33,21 +33,24 @@ function taxonomy_term_page($term) {
drupal_set_breadcrumb($breadcrumb);
drupal_add_feed('taxonomy/term/' . $term->tid . '/feed', 'RSS - ' . $term->name);
- $build = array();
+ // If there is a menu link to this term, the link becomes the last part of
+ // the active trail, and the link name becomes the page title. Thus, we must
+ // explicitly set the page title to be the node title.
+ $uri = entity_uri('taxonomy_term', $term);
- $build['term_heading'] = array(
- '#prefix' => '<div class="term-listing-heading">',
- '#suffix' => '</div>',
- 'term' => taxonomy_term_view($term, 'full'),
- );
+ // Set the term path as the canonical URL to prevent duplicate content.
+ drupal_add_html_head_link(array('rel' => 'canonical', 'href' => url($uri['path'], $uri['options'])), TRUE);
+ // Set the non-aliased path as a default shortlink.
+ drupal_add_html_head_link(array('rel' => 'shortlink', 'href' => url($uri['path'], array_merge($uri['options'], array('alias' => TRUE)))), TRUE);
+ $build = taxonomy_term_show($term);
if ($nids = taxonomy_select_nodes($term->tid, TRUE, variable_get('default_nodes_main', 10))) {
$nodes = node_load_multiple($nids);
$build += node_view_multiple($nodes);
$build['pager'] = array(
'#theme' => 'pager',
'#weight' => 5,
- );
+ );
}
else {
$build['no_content'] = array(
diff --git a/modules/taxonomy/taxonomy.test b/modules/taxonomy/taxonomy.test
index 32ae84d66..4cfb81b28 100644
--- a/modules/taxonomy/taxonomy.test
+++ b/modules/taxonomy/taxonomy.test
@@ -98,6 +98,18 @@ class TaxonomyVocabularyFunctionalTest extends TaxonomyWebTestCase {
$edit['machine_name'] = '!&^%';
$this->drupalPost('admin/structure/taxonomy/add', $edit, t('Save'));
$this->assertText(t('The machine-readable name must contain only lowercase letters, numbers, and underscores.'));
+
+ // Ensure that vocabulary titles are escaped properly.
+ $edit = array();
+ $edit['name'] = 'Don\'t Panic';
+ $edit['description'] = $this->randomName();
+ $edit['machine_name'] = 'don_t_panic';
+ $this->drupalPost('admin/structure/taxonomy/add', $edit, t('Save'));
+
+ $site_name = variable_get('site_name', 'Drupal');
+ $this->drupalGet('admin/structure/taxonomy/don_t_panic');
+ $this->assertTitle(t('Don\'t Panic | @site-name', array('@site-name' => $site_name)));
+ $this->assertNoTitle(t('Don&#039;t Panic | @site-name', array('@site-name' => $site_name)));
}
/**
@@ -1378,12 +1390,16 @@ class TaxonomyHooksTestCase extends TaxonomyWebTestCase {
function setUp() {
parent::setUp('taxonomy', 'taxonomy_test');
+ module_load_include('inc', 'taxonomy', 'taxonomy.pages');
$taxonomy_admin = $this->drupalCreateUser(array('administer taxonomy'));
$this->drupalLogin($taxonomy_admin);
}
/**
- * Test that hooks are run correctly on creating, editing and deleting a term.
+ * Test that hooks are run correctly on creating, editing, viewing,
+ * and deleting a term.
+ *
+ * @see taxonomy_test.module
*/
function testTaxonomyTermHooks() {
$vocabulary = $this->createVocabulary();
@@ -1408,6 +1424,13 @@ class TaxonomyHooksTestCase extends TaxonomyWebTestCase {
$term = taxonomy_term_load($term->tid);
$this->assertEqual($edit['antonym'], $term->antonym, 'Antonym was successfully edited.');
+ // View the term and ensure that hook_taxonomy_term_view() and
+ // hook_entity_view() are invoked.
+ $term = taxonomy_term_load($term->tid);
+ $term_build = taxonomy_term_page($term);
+ $this->assertFalse(empty($term_build['taxonomy_terms'][$term->tid]['taxonomy_test_term_view_check']), 'hook_taxonomy_term_view() was invoked when viewing the term.');
+ $this->assertFalse(empty($term_build['taxonomy_terms'][$term->tid]['taxonomy_test_entity_view_check']), 'hook_entity_view() was invoked when viewing the term.');
+
// Delete the term.
taxonomy_term_delete($term->tid);
$antonym = db_query('SELECT tid FROM {taxonomy_term_antonym} WHERE tid = :tid', array(':tid' => $term->tid))->fetchField();
diff --git a/modules/toolbar/toolbar.tpl.php b/modules/toolbar/toolbar.tpl.php
index 1df0cf03b..e85212997 100644
--- a/modules/toolbar/toolbar.tpl.php
+++ b/modules/toolbar/toolbar.tpl.php
@@ -19,6 +19,8 @@
*
* @see template_preprocess()
* @see template_preprocess_toolbar()
+ *
+ * @ingroup themeable
*/
?>
<div id="toolbar" class="<?php print $classes; ?> clearfix">
diff --git a/modules/update/update.compare.inc b/modules/update/update.compare.inc
index cd8b762d0..6e0c5feee 100644
--- a/modules/update/update.compare.inc
+++ b/modules/update/update.compare.inc
@@ -592,7 +592,10 @@ function update_calculate_project_update_status($project, &$project_data, $avail
// See if this is a higher major version than our target and yet still
// supported. If so, record it as an "Also available" release.
- if ($release['version_major'] > $target_major) {
+ // Note: some projects have a HEAD release from CVS days, which could
+ // be one of those being compared. They would not have version_major
+ // set, so we must call isset first.
+ if (isset($release['version_major']) && $release['version_major'] > $target_major) {
if (in_array($release['version_major'], $supported_majors)) {
if (!isset($project_data['also'])) {
$project_data['also'] = array();
diff --git a/modules/update/update.fetch.inc b/modules/update/update.fetch.inc
index 860a1b975..bf0039f44 100644
--- a/modules/update/update.fetch.inc
+++ b/modules/update/update.fetch.inc
@@ -288,17 +288,25 @@ function _update_build_fetch_url($project, $site_key = '') {
$name = $project['name'];
$url = _update_get_fetch_url_base($project);
$url .= '/' . $name . '/' . DRUPAL_CORE_COMPATIBILITY;
- // Only append a site_key and the version information if we have a site_key
- // in the first place, and if this is not a disabled module or theme. We do
- // not want to record usage statistics for disabled code.
+
+ // Only append usage infomation if we have a site key and the project is
+ // enabled. We do not want to record usage statistics for disabled projects.
if (!empty($site_key) && (strpos($project['project_type'], 'disabled') === FALSE)) {
+ // Append the site key.
$url .= (strpos($url, '?') !== FALSE) ? '&' : '?';
$url .= 'site_key=';
$url .= rawurlencode($site_key);
+
+ // Append the version.
if (!empty($project['info']['version'])) {
$url .= '&version=';
$url .= rawurlencode($project['info']['version']);
}
+
+ // Append the list of modules or themes enabled.
+ $list = array_keys($project['includes']);
+ $url .= '&list=';
+ $url .= rawurlencode(implode(',', $list));
}
return $url;
}
diff --git a/modules/update/update.test b/modules/update/update.test
index e297194ae..b29f6ac86 100644
--- a/modules/update/update.test
+++ b/modules/update/update.test
@@ -769,6 +769,7 @@ class UpdateCoreUnitTestCase extends DrupalUnitTestCase {
$project['project_type'] = '';
$project['info']['version'] = '';
$project['info']['project status url'] = 'http://www.example.com';
+ $project['includes'] = array('module1' => 'Module 1', 'module2' => 'Module 2');
$site_key = '';
$expected = 'http://www.example.com/' . $project['name'] . '/' . DRUPAL_CORE_COMPATIBILITY;
$url = _update_build_fetch_url($project, $site_key);
@@ -785,14 +786,16 @@ class UpdateCoreUnitTestCase extends DrupalUnitTestCase {
$project['project_type'] = '';
$expected = 'http://www.example.com/' . $project['name'] . '/' . DRUPAL_CORE_COMPATIBILITY;
$expected .= '?site_key=site_key';
+ $expected .= '&list=' . rawurlencode('module1,module2');
$url = _update_build_fetch_url($project, $site_key);
$this->assertEqual($url, $expected, "When site_key provided, '$url' should be '$expected'.");
- // http://drupal.org/node/1481156 test incorrect logic when url contains
+ // http://drupal.org/node/1481156 test incorrect logic when URL contains
// a question mark.
$project['info']['project status url'] = 'http://www.example.com/?project=';
$expected = 'http://www.example.com/?project=/' . $project['name'] . '/' . DRUPAL_CORE_COMPATIBILITY;
$expected .= '&site_key=site_key';
+ $expected .= '&list=' . rawurlencode('module1,module2');
$url = _update_build_fetch_url($project, $site_key);
$this->assertEqual($url, $expected, "When ? is present, '$url' should be '$expected'.");
diff --git a/modules/user/user-picture.tpl.php b/modules/user/user-picture.tpl.php
index a33d2661d..ee8218786 100644
--- a/modules/user/user-picture.tpl.php
+++ b/modules/user/user-picture.tpl.php
@@ -12,6 +12,8 @@
* check_plain() before use.
*
* @see template_preprocess_user_picture()
+ *
+ * @ingroup themeable
*/
?>
<?php if ($user_picture): ?>
diff --git a/modules/user/user-profile.tpl.php b/modules/user/user-profile.tpl.php
index a1611c835..0a64fed84 100644
--- a/modules/user/user-profile.tpl.php
+++ b/modules/user/user-profile.tpl.php
@@ -30,6 +30,8 @@
* @see user-profile-item.tpl.php
* Where the html is handled for each item in the group.
* @see template_preprocess_user_profile()
+ *
+ * @ingroup themeable
*/
?>
<div class="profile"<?php print $attributes; ?>>
diff --git a/modules/user/user.api.php b/modules/user/user.api.php
index f610408dc..64c863fe4 100644
--- a/modules/user/user.api.php
+++ b/modules/user/user.api.php
@@ -299,6 +299,14 @@ function hook_user_login(&$edit, $account) {
/**
* The user just logged out.
*
+ * Note that when this hook is invoked, the changes have not yet been written to
+ * the database, because a database transaction is still in progress. The
+ * transaction is not finalized until the save operation is entirely completed
+ * and user_save() goes out of scope. You should not rely on data in the
+ * database at this time as it is not updated yet. You should also note that any
+ * write/update database queries executed from this hook are also not committed
+ * immediately. Check user_save() and db_transaction() for more info.
+ *
* @param $account
* The user object on which the operation was just performed.
*/
@@ -317,6 +325,14 @@ function hook_user_logout($account) {
* The module should format its custom additions for display and add them to the
* $account->content array.
*
+ * Note that when this hook is invoked, the changes have not yet been written to
+ * the database, because a database transaction is still in progress. The
+ * transaction is not finalized until the save operation is entirely completed
+ * and user_save() goes out of scope. You should not rely on data in the
+ * database at this time as it is not updated yet. You should also note that any
+ * write/update database queries executed from this hook are also not committed
+ * immediately. Check user_save() and db_transaction() for more info.
+ *
* @param $account
* The user object on which the operation is being performed.
* @param $view_mode
diff --git a/modules/user/user.install b/modules/user/user.install
index 217577de7..cff873a45 100644
--- a/modules/user/user.install
+++ b/modules/user/user.install
@@ -384,7 +384,7 @@ function user_update_dependencies() {
* An array of permissions names.
* @param $module
* The name of the module defining the permissions.
- * @ingroup update-api-6.x-to-7.x
+ * @ingroup update_api
*/
function _update_7000_user_role_grant_permissions($rid, array $permissions, $module) {
// Grant new permissions for the role.
diff --git a/modules/user/user.module b/modules/user/user.module
index 47ac64273..0e074d97b 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -187,7 +187,7 @@ function user_entity_info() {
}
/**
- * Entity uri callback.
+ * Entity URI callback.
*/
function user_uri($user) {
return array(
@@ -1873,7 +1873,7 @@ function user_menu_link_alter(&$link) {
*/
function user_translated_menu_link_alter(&$link) {
// Hide the "User account" link for anonymous users.
- if ($link['link_path'] == 'user' && $link['module'] == 'system' && user_is_anonymous()) {
+ if ($link['link_path'] == 'user' && $link['module'] == 'system' && !$GLOBALS['user']->uid) {
$link['hidden'] = 1;
}
}
@@ -2574,6 +2574,14 @@ function user_build_content($account, $view_mode = 'full', $langcode = NULL) {
// Remove previously built content, if exists.
$account->content = array();
+ // Allow modules to change the view mode.
+ $context = array(
+ 'entity_type' => 'user',
+ 'entity' => $account,
+ 'langcode' => $langcode,
+ );
+ drupal_alter('entity_view_mode', $view_mode, $context);
+
// Build fields content.
field_attach_prepare_view('user', array($account->uid => $account), $view_mode, $langcode);
entity_prepare_view('user', array($account->uid => $account), $langcode);
diff --git a/modules/user/user.test b/modules/user/user.test
index b53db0769..92af9fa9a 100644
--- a/modules/user/user.test
+++ b/modules/user/user.test
@@ -1487,7 +1487,7 @@ class UserAutocompleteTestCase extends DrupalWebTestCase {
/**
- * Test user-links in secondary menu.
+ * Tests user links in the secondary menu.
*/
class UserAccountLinksUnitTests extends DrupalWebTestCase {
public static function getInfo() {
@@ -1498,6 +1498,10 @@ class UserAccountLinksUnitTests extends DrupalWebTestCase {
);
}
+ function setUp() {
+ parent::setUp('menu');
+ }
+
/**
* Tests the secondary menu.
*/
@@ -1533,6 +1537,36 @@ class UserAccountLinksUnitTests extends DrupalWebTestCase {
$element = $this->xpath('//ul[@id=:menu_id]', array(':menu_id' => 'secondary-menu-links'));
$this->assertEqual(count($element), 0, 'No secondary-menu for logged-out users.');
}
+
+ /**
+ * Tests disabling the 'My account' link.
+ */
+ function testDisabledAccountLink() {
+ // Create an admin user and log in.
+ $this->drupalLogin($this->drupalCreateUser(array('access administration pages', 'administer menu')));
+
+ // Verify that the 'My account' link is enabled.
+ $this->drupalGet('admin/structure/menu/manage/user-menu');
+ $this->assertFieldChecked('edit-mlid2-hidden', "The 'My account' link is enabled by default.");
+
+ // Disable the 'My account' link.
+ $edit = array(
+ 'mlid:2[hidden]' => FALSE,
+ );
+ $this->drupalPost('admin/structure/menu/manage/user-menu', $edit, t('Save configuration'));
+
+ // Get the homepage.
+ $this->drupalGet('<front>');
+
+ // Verify that the 'My account' link does not appear when disabled.
+ $link = $this->xpath('//ul[@id=:menu_id]/li/a[contains(@href, :href) and text()=:text]', array(
+ ':menu_id' => 'secondary-menu-links',
+ ':href' => 'user',
+ ':text' => 'My account',
+ ));
+ $this->assertEqual(count($link), 0, 'My account link is not in the secondary menu.');
+ }
+
}
/**