Commit 032fe0a6 authored by webchick's avatar webchick

#539022 follow-up by David_Rothstein: Batch API should use the current theme to run the batches.

parent 4363c22b
......@@ -16,6 +16,26 @@
* @see batch_get()
*/
/**
* Loads a batch from the database.
*
* @param $id
* The ID of the batch to load. When a progressive batch is being processed,
* the relevant ID is found in $_REQUEST['id'].
* @return
* An array representing the batch, or FALSE if no batch was found.
*/
function batch_load($id) {
$batch = db_query("SELECT batch FROM {batch} WHERE bid = :bid AND token = :token", array(
':bid' => $id,
':token' => drupal_get_token($id),
))->fetchField();
if ($batch) {
return unserialize($batch);
}
return FALSE;
}
/**
* State-based dispatcher for the batch processing page.
*
......@@ -28,19 +48,15 @@ function _batch_page() {
return FALSE;
}
// Retrieve the current state of batch from db.
$batch = db_query("SELECT batch FROM {batch} WHERE bid = :bid AND token = :token", array(
':bid' => $_REQUEST['id'],
':token' => drupal_get_token($_REQUEST['id']))
)->fetchField();
// Retrieve the current state of the batch.
if (!$batch) {
drupal_set_message(t('No active batch.'), 'error');
drupal_goto();
$batch = batch_load($_REQUEST['id']);
if (!$batch) {
drupal_set_message(t('No active batch.'), 'error');
drupal_goto();
}
}
$batch = unserialize($batch);
// Register database update for the end of processing.
register_shutdown_function('_batch_shutdown');
......
......@@ -6,6 +6,40 @@
* Unit tests for the Drupal Batch API.
*/
/**
* Tests for the batch API progress page theme.
*/
class BatchAPIThemeTestCase extends DrupalWebTestCase {
public static function getInfo() {
return array(
'name' => 'Batch API progress page theme',
'description' => 'Tests that while a progressive batch is running, it correctly uses the theme of the page that started the batch.',
'group' => 'Batch API',
);
}
function setUp() {
parent::setUp('system_test');
// Make sure that the page which starts the batch (an administrative page)
// is using a different theme than would normally be used by the batch API.
variable_set('theme_default', 'garland');
variable_set('admin_theme', 'seven');
}
/**
* Tests that the batch API progress page uses the correct theme.
*/
function testBatchAPIProgressPageTheme() {
// Visit an administrative page that runs a test batch, and check that the
// theme that was used during batch execution (which the batch callback
// function saved as a variable) matches the theme used on the
// administrative page.
$this->drupalGet('admin/system-test/batch-theme');
$batch_theme_used = variable_get('system_test_batch_theme_used', 'garland');
$this->assertEqual($batch_theme_used, 'seven', t('A progressive batch correctly uses the theme of the page that started the batch.'));
}
}
/**
* Tests the function _batch_api_percentage() to make sure that the rounding
* works properly in all cases.
......
......@@ -5,6 +5,11 @@
* Implement hook_menu().
*/
function system_test_menu() {
$items['admin/system-test/batch-theme'] = array(
'page callback' => 'system_test_batch_theme',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
$items['system-test/sleep/%'] = array(
'page callback' => 'system_test_sleep',
'page arguments' => array(2),
......@@ -97,6 +102,34 @@ function system_test_menu() {
return $items;
}
/**
* Menu callback; start a new batch for testing the batch progress page theme.
*/
function system_test_batch_theme() {
$batch = array(
'operations' => array(
array('system_test_batch_theme_callback', array()),
),
);
batch_set($batch);
// Force the batch to redirect to some page other than this one (to avoid an
// infinite loop).
batch_process('node');
}
/**
* Batch callback function for testing the theme used by a batch.
*/
function system_test_batch_theme_callback() {
// Because drupalGet() steps through the full progressive batch before
// returning control to the test function, we cannot test that the correct
// theme is being used on the batch processing page by viewing that page
// directly. Instead, we save the theme being used in a variable here, so
// that it can be loaded and inspected in the thread running the test.
global $theme;
variable_set('system_test_batch_theme_used', $theme);
}
function system_test_sleep($seconds) {
sleep($seconds);
}
......
......@@ -2054,10 +2054,6 @@ function system_batch_page() {
require_once DRUPAL_ROOT . '/includes/batch.inc';
$output = _batch_page();
// Use the same theme that the page that started the batch.
$batch = &batch_get();
$GLOBALS['custom_theme'] = $batch['theme'];
if ($output === FALSE) {
drupal_access_denied();
}
......
......@@ -993,12 +993,29 @@ function system_menu() {
$items['batch'] = array(
'page callback' => 'system_batch_page',
'access callback' => TRUE,
'theme callback' => '_system_batch_theme',
'type' => MENU_CALLBACK,
'file' => 'system.admin.inc',
);
return $items;
}
/**
* Theme callback for the default batch page.
*/
function _system_batch_theme() {
// Retrieve the current state of the batch.
$batch = &batch_get();
if (!$batch && isset($_REQUEST['id'])) {
require_once DRUPAL_ROOT . '/includes/batch.inc';
$batch = batch_load($_REQUEST['id']);
}
// Use the same theme as the page that started the batch.
if (!empty($batch['theme'])) {
return $batch['theme'];
}
}
/**
* Implementation of hook_library().
*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment