From 1bce7388c9227b12512f93f6ac0fcc07416f6ccf Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Tue, 14 Jan 2020 15:30:11 +0000
Subject: [PATCH] Issue #3073261 by oknate, phenaproxima, Wim Leers: Improve
 CKEditorTestTrait

(cherry picked from commit b28a392ecec6e0421ad7e31f9b3398289e6a527b)
---
 .../tests/src/Traits/CKEditorTestTrait.php    | 42 ++++++++++++-------
 1 file changed, 27 insertions(+), 15 deletions(-)

diff --git a/core/modules/ckeditor/tests/src/Traits/CKEditorTestTrait.php b/core/modules/ckeditor/tests/src/Traits/CKEditorTestTrait.php
index 24db1b14ae3d..e96313f1413e 100644
--- a/core/modules/ckeditor/tests/src/Traits/CKEditorTestTrait.php
+++ b/core/modules/ckeditor/tests/src/Traits/CKEditorTestTrait.php
@@ -13,7 +13,7 @@ trait CKEditorTestTrait {
    * Waits for CKEditor to initialize.
    *
    * @param string $instance_id
-   *   The CKEditor instance ID.
+   *   (optional) The CKEditor instance ID. Defaults to 'edit-body-0-value'.
    * @param int $timeout
    *   (optional) Timeout in milliseconds, defaults to 10000.
    */
@@ -22,24 +22,28 @@ protected function waitForEditor($instance_id = 'edit-body-0-value', $timeout =
       (function() {
         return (
           typeof CKEDITOR !== 'undefined'
-          && typeof CKEDITOR.instances["$instance_id"] !== 'undefined'
-          && CKEDITOR.instances["$instance_id"].instanceReady
+          && typeof CKEDITOR.instances["{$instance_id}"] !== 'undefined'
+          && CKEDITOR.instances["{$instance_id}"].instanceReady
         );
       }());
 JS;
-
-    $this->getSession()->wait($timeout, $condition);
+    $this->assertJsCondition($condition, $timeout);
   }
 
   /**
    * Assigns a name to the CKEditor iframe.
    *
+   * @param string $id
+   *   (optional) The id to assign the iframe element. Defaults to 'ckeditor'.
+   * @param string $instance_id
+   *   (optional) The CKEditor instance ID. Defaults to 'edit-body-0-value'.
+   *
    * @see \Behat\Mink\Session::switchToIFrame()
    */
-  protected function assignNameToCkeditorIframe() {
+  protected function assignNameToCkeditorIframe($id = 'ckeditor', $instance_id = 'edit-body-0-value') {
     $javascript = <<<JS
 (function(){
-  document.getElementsByClassName('cke_wysiwyg_frame')[0].id = 'ckeditor';
+  CKEDITOR.instances['{$instance_id}'].element.getParent().find('.cke_wysiwyg_frame').$[0].id = '{$id}';
 })()
 JS;
     $this->getSession()->evaluateScript($javascript);
@@ -50,9 +54,11 @@ protected function assignNameToCkeditorIframe() {
    *
    * @param string $name
    *   The name of the button, such as `drupallink`, `source`, etc.
+   * @param string $instance_id
+   *   (optional) The CKEditor instance ID. Defaults to 'edit-body-0-value'.
    */
-  protected function pressEditorButton($name) {
-    $this->getEditorButton($name)->click();
+  protected function pressEditorButton($name, $instance_id = 'edit-body-0-value') {
+    $this->getEditorButton($name, $instance_id)->click();
   }
 
   /**
@@ -60,13 +66,15 @@ protected function pressEditorButton($name) {
    *
    * @param string $name
    *   The name of the button, such as `drupallink`, `source`, etc.
+   * @param string $instance_id
+   *   (optional) The CKEditor instance ID. Defaults to 'edit-body-0-value'.
    *
    * @return \Behat\Mink\Element\NodeElement|null
    *   The page element node if found, NULL if not.
    */
-  protected function getEditorButton($name) {
+  protected function getEditorButton($name, $instance_id = 'edit-body-0-value') {
     $this->getSession()->switchToIFrame();
-    $button = $this->assertSession()->waitForElementVisible('css', 'a.cke_button__' . $name);
+    $button = $this->assertSession()->waitForElementVisible('css', "#cke_$instance_id a.cke_button__" . $name);
     $this->assertNotEmpty($button);
 
     return $button;
@@ -77,9 +85,11 @@ protected function getEditorButton($name) {
    *
    * @param string $name
    *   The name of the button, such as `drupallink`, `source`, etc.
+   * @param string $instance_id
+   *   (optional) The CKEditor instance ID. Defaults to 'edit-body-0-value'.
    */
-  protected function assertEditorButtonDisabled($name) {
-    $button = $this->getEditorButton($name);
+  protected function assertEditorButtonDisabled($name, $instance_id = 'edit-body-0-value') {
+    $button = $this->getEditorButton($name, $instance_id);
     $this->assertTrue($button->hasClass('cke_button_disabled'));
     $this->assertSame('true', $button->getAttribute('aria-disabled'));
   }
@@ -89,9 +99,11 @@ protected function assertEditorButtonDisabled($name) {
    *
    * @param string $name
    *   The name of the button, such as `drupallink`, `source`, etc.
+   * @param string $instance_id
+   *   (optional) The CKEditor instance ID. Defaults to 'edit-body-0-value'.
    */
-  protected function assertEditorButtonEnabled($name) {
-    $button = $this->getEditorButton($name);
+  protected function assertEditorButtonEnabled($name, $instance_id = 'edit-body-0-value') {
+    $button = $this->getEditorButton($name, $instance_id);
     $this->assertFalse($button->hasClass('cke_button_disabled'));
     $this->assertSame('false', $button->getAttribute('aria-disabled'));
   }
-- 
GitLab