Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / web / core / modules / contextual / tests / src / FunctionalJavascript / EditModeTest.php
index dc978aad1dc158a231ff1413930fe74fa3ce601c..a61ea8a3d788e87338bc0eac7d3a9e6f007446cd 100644 (file)
@@ -44,27 +44,45 @@ class EditModeTest extends JavascriptTestBase {
   }
 
   /**
-   * Tests that Drupal.announce messages appear.
+   * Tests enabling and disabling edit mode.
    */
-  public function testAnnounceEditMode() {
+  public function testEditModeEnableDisalbe() {
     $web_assert = $this->assertSession();
-    $this->drupalGet('user');
-
-    // After the page loaded we need to additionally wait until the settings
-    // tray Ajax activity is done.
-    $web_assert->assertWaitOnAjaxRequest();
-
-    // Enable edit mode.
-    $this->pressToolbarEditButton();
-    $this->assertAnnounceEditMode();
-    // Disable edit mode.
-    $this->pressToolbarEditButton();
-    $this->assertAnnounceLeaveEditMode();
-    // Enable edit mode again.
-    $this->pressToolbarEditButton();
-    // Finally assert that the 'edit mode enabled' announcement is still correct
-    // after toggling the edit mode at least once.
-    $this->assertAnnounceEditMode();
+    $page = $this->getSession()->getPage();
+    // Get the page twice to ensure edit mode remains enabled after a new page
+    // request.
+    for ($page_get_count = 0; $page_get_count < 2; $page_get_count++) {
+      $this->drupalGet('user');
+      $expected_restricted_tab_count = 1 + count($page->findAll('css', '[data-contextual-id]'));
+
+      // After the page loaded we need to additionally wait until the settings
+      // tray Ajax activity is done.
+      $web_assert->assertWaitOnAjaxRequest();
+
+      if ($page_get_count == 0) {
+        $unrestricted_tab_count = $this->getTabbableElementsCount();
+        $this->assertGreaterThan($expected_restricted_tab_count, $unrestricted_tab_count);
+
+        // Enable edit mode.
+        // After the first page load the page will be in edit mode when loaded.
+        $this->pressToolbarEditButton();
+      }
+
+      $this->assertAnnounceEditMode();
+      $this->assertSame($expected_restricted_tab_count, $this->getTabbableElementsCount());
+
+      // Disable edit mode.
+      $this->pressToolbarEditButton();
+      $this->assertAnnounceLeaveEditMode();
+      $this->assertSame($unrestricted_tab_count, $this->getTabbableElementsCount());
+      // Enable edit mode again.
+      $this->pressToolbarEditButton();
+      // Finally assert that the 'edit mode enabled' announcement is still
+      // correct after toggling the edit mode at least once.
+      $this->assertAnnounceEditMode();
+      $this->assertSame($expected_restricted_tab_count, $this->getTabbableElementsCount());
+    }
+
   }
 
   /**
@@ -100,4 +118,20 @@ class EditModeTest extends JavascriptTestBase {
     $web_assert->elementNotContains('css', static::ANNOUNCE_SELECTOR, 'Tabbing is constrained to a set of');
   }
 
+  /**
+   * Gets the number of elements that are tabbable.
+   *
+   * @return int
+   *   The number of tabbable elements.
+   */
+  protected function getTabbableElementsCount() {
+    // Mark all tabbable elements.
+    $this->getSession()->executeScript("jQuery(':tabbable').attr('data-marked', '');");
+    // Count all marked elements.
+    $count = count($this->getSession()->getPage()->findAll('css', "[data-marked]"));
+    // Remove set attributes.
+    $this->getSession()->executeScript("jQuery('[data-marked]').removeAttr('data-marked');");
+    return $count;
+  }
+
 }