Issue #1742438 by larowlan, Christian Biggins, kim.pepper, dcam, Everett Zufelt,...
authorwebchick
Thu, 11 Oct 2012 22:04:13 +0000 (15:04 -0700)
committerwebchick
Thu, 11 Oct 2012 22:04:13 +0000 (15:04 -0700)
includes/form.inc
modules/simpletest/tests/form.test
modules/simpletest/tests/form_test.module

index 826b677..6a1e2f7 100644 (file)
@@ -3735,11 +3735,25 @@ function form_process_vertical_tabs($element, &$form_state) {
  */
 function theme_vertical_tabs($variables) {
   $element = $variables['element'];
-  // Add required JavaScript and Stylesheet.
-  drupal_add_library('system', 'drupal.vertical-tabs');
+  // Even if there are no tabs the element will still have a child element for
+  // the active tab. We need to iterate over the tabs to ascertain if any
+  // are visible before showing the wrapper and h2.
+  $visible_tab = FALSE;
+  $output = '';
+  foreach (element_children($element['group']) as $tab_index) {
+    if (!isset($element['group'][$tab_index]['#access']) ||
+        !empty($element['group'][$tab_index]['#access'])) {
+      $visible_tab = TRUE;
+      break;
+    }
+  }
+  if ($visible_tab) {
+    // Add required JavaScript and Stylesheet.
+    drupal_add_library('system', 'drupal.vertical-tabs');
 
-  $output = '<h2 class="element-invisible">' . t('Vertical Tabs') . '</h2>';
-  $output .= '<div class="vertical-tabs-panes">' . $element['#children'] . '</div>';
+    $output = '<h2 class="element-invisible">' . t('Vertical Tabs') . '</h2>';
+    $output .= '<div class="vertical-tabs-panes">' . $element['#children'] . '</div>';
+  }
   return $output;
 }
 
index 675e8d1..08d2fca 100644 (file)
@@ -930,6 +930,10 @@ class FormsElementsVerticalTabsFunctionalTest extends DrupalWebTestCase {
 
   function setUp() {
     parent::setUp('form_test');
+
+    $this->admin_user = $this->drupalCreateUser(array('access vertical_tab_test tabs'));
+    $this->web_user = $this->drupalCreateUser();
+    $this->drupalLogin($this->admin_user);
   }
 
   /**
@@ -943,6 +947,22 @@ class FormsElementsVerticalTabsFunctionalTest extends DrupalWebTestCase {
     $position2 = strpos($this->content, 'misc/collapse.js');
     $this->assertTrue($position1 !== FALSE && $position2 !== FALSE && $position1 < $position2, t('vertical-tabs.js is included before collapse.js'));
   }
+
+  /**
+   * Ensures that vertical tab markup is not shown if user has no tab access.
+   */
+  function testWrapperNotShownWhenEmpty() {
+    // Test admin user can see vertical tabs and wrapper.
+    $this->drupalGet('form_test/vertical-tabs');
+    $wrapper = $this->xpath("//div[@class='vertical-tabs-panes']");
+    $this->assertTrue(isset($wrapper[0]), 'Vertical tab panes found.');
+
+    // Test wrapper markup not present for non-privileged web user.
+    $this->drupalLogin($this->web_user);
+    $this->drupalGet('form_test/vertical-tabs');
+    $wrapper = $this->xpath("//div[@class='vertical-tabs-panes']");
+    $this->assertFalse(isset($wrapper[0]), 'Vertical tab wrappers are not displayed to unprivileged users.');
+  }
 }
 
 /**
index 5d65276..5dd1ce7 100644 (file)
@@ -223,6 +223,18 @@ function form_test_menu() {
 }
 
 /**
+ * Implements hook_permission().
+ */
+function form_test_permission() {
+  $perms = array(
+    'access vertical_tab_test tabs' => array(
+      'title' => t('Access vertical_tab_test tabs'),
+    ),
+  );
+  return $perms;
+}
+
+/**
  * Form submit handler to return form values as JSON.
  */
 function _form_test_submit_values_json($form, &$form_state) {
@@ -631,6 +643,7 @@ function _form_test_vertical_tabs_form($form, &$form_state) {
     '#title' => t('Tab 1'),
     '#collapsible' => TRUE,
     '#group' => 'vertical_tabs',
+    '#access' => user_access('access vertical_tab_test tabs')
   );
   $form['tab1']['field1'] = array(
     '#title' => t('Field 1'),
@@ -641,6 +654,7 @@ function _form_test_vertical_tabs_form($form, &$form_state) {
     '#title' => t('Tab 2'),
     '#collapsible' => TRUE,
     '#group' => 'vertical_tabs',
+    '#access' => user_access('access vertical_tab_test tabs')
   );
   $form['tab2']['field2'] = array(
     '#title' => t('Field 2'),