diff options
author | Dries Buytaert <dries@buytaert.net> | 2010-03-27 14:24:14 +0000 |
---|---|---|
committer | Dries Buytaert <dries@buytaert.net> | 2010-03-27 14:24:14 +0000 |
commit | cb112e9a346f8c1f3dda28055e0081ed33b5dcb4 (patch) | |
tree | c6eb11ae1391217fad6842cb90b811b63fd7462c | |
parent | 73deaa340af14f93cba9f3c3bbfb1071f31daec1 (diff) | |
download | brdo-cb112e9a346f8c1f3dda28055e0081ed33b5dcb4.tar.gz brdo-cb112e9a346f8c1f3dda28055e0081ed33b5dcb4.tar.bz2 |
- Patch #718662 by andypost, c960657: DBLog listings truncate messages in the middle of HTML tags.
-rw-r--r-- | modules/dblog/dblog.admin.inc | 53 | ||||
-rw-r--r-- | modules/dblog/dblog.module | 12 | ||||
-rw-r--r-- | modules/dblog/dblog.test | 54 |
3 files changed, 91 insertions, 28 deletions
diff --git a/modules/dblog/dblog.admin.inc b/modules/dblog/dblog.admin.inc index 93d28b946..4f344f577 100644 --- a/modules/dblog/dblog.admin.inc +++ b/modules/dblog/dblog.admin.inc @@ -8,6 +8,9 @@ /** * Menu callback; displays a listing of log messages. + * + * Messages are truncated at 56 chars. Full-length message could be viewed at + * the message details page. */ function dblog_overview() { $filter = dblog_build_filter_query(); @@ -65,7 +68,7 @@ function dblog_overview() { $icons[$dblog->severity], t($dblog->type), format_date($dblog->timestamp, 'short'), - l(truncate_utf8(_dblog_format_message($dblog), 56, TRUE, TRUE), 'admin/reports/event/' . $dblog->wid, array('html' => TRUE)), + theme('dblog_message', array('event' => $dblog, 'link' => TRUE)), theme('username', array('account' => $dblog)), $dblog->link, ), @@ -87,8 +90,12 @@ function dblog_overview() { } /** - * Menu callback; generic function to display a page of the most frequent - * dblog events of a specified type. + * Menu callback; generic function to display a page of the most frequent events. + * + * Messages are not truncated because events from this page have no detail view. + * + * @param $type + * type of dblog events to display. */ function dblog_top($type) { @@ -114,7 +121,7 @@ function dblog_top($type) { $rows = array(); foreach ($result as $dblog) { - $rows[] = array($dblog->count, truncate_utf8(_dblog_format_message($dblog), 56, TRUE, TRUE)); + $rows[] = array($dblog->count, theme('dblog_message', array('event' => $dblog))); } $build['dblog_top_table'] = array( @@ -158,7 +165,7 @@ function dblog_event($id) { ), array( array('data' => t('Message'), 'header' => TRUE), - _dblog_format_message($dblog), + theme('dblog_message', array('event' => $dblog)), ), array( array('data' => t('Severity'), 'header' => TRUE), @@ -246,21 +253,35 @@ function dblog_filters() { /** * Formats a log message for display. * - * @param $dblog - * An object with at least the message and variables properties + * @param $variables + * An associative array containing: + * - event: An object with at least the message and variables properties. + * - link: (optional) Format message as link, event->wid is required. + * + * @ingroup themeable */ -function _dblog_format_message($dblog) { - // Legacy messages and user specified text - if ($dblog->variables === 'N;') { - return $dblog->message; - } - // Message to translate with injected variables - else { - return t($dblog->message, unserialize($dblog->variables)); +function theme_dblog_message($variables) { + $output = ''; + $event = $variables['event']; + // Check for required properties. + if (isset($event->message) && isset($event->variables)) { + // Messages without variables or user specified text. + if ($event->variables === 'N;') { + $output = $event->message; + } + // Message to translate with injected variables. + else { + $output = t($event->message, unserialize($event->variables)); + } + if ($variables['link'] && isset($event->wid)) { + // Truncate message to 56 chars. + $output = truncate_utf8(filter_xss($output, array()), 56, TRUE, TRUE); + $output = l($output, 'admin/reports/event/' . $event->wid, array('html' => TRUE)); + } } + return $output; } - /** * Return form for dblog administration filters. * diff --git a/modules/dblog/dblog.module b/modules/dblog/dblog.module index 280989887..d27507d24 100644 --- a/modules/dblog/dblog.module +++ b/modules/dblog/dblog.module @@ -144,3 +144,15 @@ function dblog_form_system_logging_settings_alter(&$form, $form_state) { ); $form['actions']['#weight'] = 1; } + +/** + * Implements hook_theme(). + */ +function dblog_theme() { + return array( + 'dblog_message' => array( + 'variables' => array('event' => NULL, 'link' => FALSE), + 'file' => 'dblog.admin.inc', + ), + ); +} diff --git a/modules/dblog/dblog.test b/modules/dblog/dblog.test index 5da5abf49..92f0dd4d3 100644 --- a/modules/dblog/dblog.test +++ b/modules/dblog/dblog.test @@ -74,9 +74,7 @@ class DBLogTestCase extends DrupalWebTestCase { $this->assertTrue($count > $row_limit, t('Dblog row count of @count exceeds row limit of @limit', array('@count' => $count, '@limit' => $row_limit))); // Run cron job. - $this->drupalGet('admin/reports/status/run-cron'); - $this->assertResponse(200); - $this->assertText(t('Cron ran successfully'), t('Cron ran successfully')); + $this->cronRun(); // Verify dblog row count equals row limit plus one because cron adds a record after it runs. $count = db_query('SELECT COUNT(wid) FROM {watchdog}')->fetchField(); $this->assertTrue($count == $row_limit + 1, t('Dblog row count of @count equals row limit of @limit plus one', array('@count' => $count, '@limit' => $row_limit))); @@ -108,9 +106,9 @@ class DBLogTestCase extends DrupalWebTestCase { 'ip' => ip_address(), 'timestamp' => REQUEST_TIME, ); - $message = 'Log entry added to test the dblog row limit.'; + $message = 'Log entry added to test the dblog row limit. Entry #'; for ($i = 0; $i < $count; $i++) { - $log['message'] = $this->randomString(); + $log['message'] = $message . $i; dblog_watchdog($log); } } @@ -181,7 +179,7 @@ class DBLogTestCase extends DrupalWebTestCase { */ private function doUser() { // Set user variables. - $name = $this->randomName(4); + $name = $this->randomName(); $pass = user_password(); // Add user using form to generate add user event (which is not triggered by drupalCreateUser). $edit = array(); @@ -223,11 +221,38 @@ class DBLogTestCase extends DrupalWebTestCase { // Default display includes name and email address; if too long then email is replaced by three periods. $this->assertLogMessage(t('New user: %name (%email).', array('%name' => $name, '%email' => $user->mail)), t('DBLog event was recorded: [add user]')); // Login user. - $this->assertLogMessage(t('Session opened for %name', array('%name' => $name)), t('DBLog event was recorded: [login user]')); + $this->assertLogMessage(t('Session opened for %name.', array('%name' => $name)), t('DBLog event was recorded: [login user]')); // Logout user. - $this->assertLogMessage(t('Session closed for %name', array('%name' => $name)), t('DBLog event was recorded: [logout user]')); + $this->assertLogMessage(t('Session closed for %name.', array('%name' => $name)), t('DBLog event was recorded: [logout user]')); // Delete user. - $this->assertLogMessage(t('Deleted user: %name', array('%name' => $name)), t('DBLog event was recorded: [delete user]')); + $message = t('Deleted user: %name %email.', array('%name' => $name, '%email' => '<' . $user->mail . '>')); + $message_text = truncate_utf8(filter_xss($message, array()), 56, TRUE, TRUE); + // Verify full message on details page. + $link = FALSE; + if ($links = $this->xpath('//a[text()="' . html_entity_decode($message_text) . '"]')) { + // Found link with the message text. + $links = array_shift($links); + foreach ($links->attributes() as $attr => $value) { + if ($attr == 'href') { + // Extract link to details page. + $link = drupal_substr($value, strpos($value, 'admin/reports/event/')); + $this->drupalGet($link); + // Check for full message text on the details page. + $this->assertRaw($message, t('DBLog event details was found: [delete user]')); + break; + } + } + } + $this->assertTrue($link, t('DBLog event was recorded: [delete user]')); + // Visit random URL (to generate page not found event). + $not_found_url = $this->randomName(60); + $this->drupalGet($not_found_url); + $this->assertResponse(404); + // View dblog page-not-found report page. + $this->drupalGet('admin/reports/page-not-found'); + $this->assertResponse(200); + // Check that full-length url displayed. + $this->assertText($not_found_url, t('DBLog event was recorded: [page not found]')); } /** @@ -537,15 +562,20 @@ class DBLogTestCase extends DrupalWebTestCase { /** * Assert messages appear on the log overview screen. * + * This function should be used only for admin/reports/dblog page, because it + * check for the message link text truncated to 56 characters. Other dblog + * pages have no detail links so contains a full message text. + * * @param $log_message * The message to check. * @param $message * The message to pass to simpletest. */ protected function assertLogMessage($log_message, $message) { - // Truncate at 56 characters to compare with dblog's HTML output. - // @todo: Check the database instead for the exact error string. - $this->assertRaw(truncate_utf8($log_message, 56, TRUE, TRUE), $message); + $message_text = truncate_utf8(filter_xss($log_message, array()), 56, TRUE, TRUE); + // After filter_xss() HTML entities should be converted to their characters + // because assertLink() uses this string in xpath() to query DOM. + $this->assertLink(html_entity_decode($message_text), 0, $message); } } |