cookies-1.0.3/modules/cookies_filter/tests/src/FunctionalJavascript/TestCookiesFilterJsIframe.php

modules/cookies_filter/tests/src/FunctionalJavascript/TestCookiesFilterJsIframe.php
<?php

namespace Drupal\Tests\cookies_filter\FunctionalJavascript;

use Drupal\cookies_filter\Entity\CookiesServiceFilterEntity;

/**
 * Tests cookies_filter embed Element functionalities.
 *
 * @group cookies_filter
 */
class TestCookiesFilterJsIframe extends CookiesFilterJsTestBase {

  /**
   * Tests basic iframe blocking functionalities with placeholder "none".
   */
  public function testIframeBlockingPlaceholderNoneBasic() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');
    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'none',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
  }

  /**
   * Tests multiple iframes with placeholder "none".
   */
  public function testIframeBlockingPlaceholderNoneMultiple() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');
    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'none',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="testClass" src="demo_iframe.html"></iframe>
                    <iframe id="testid3" class="testClass" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());

    // Check first iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check second iframe:
    $session->elementExists('css', 'iframe#testid2');
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Check third iframe:
    $session->elementExists('css', 'iframe#testid3');
    $session->elementAttributeNotExists('css', '#testid3', 'src');
    $session->elementAttributeExists('css', 'iframe#testid3', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid3');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframes are unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    // Check first iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // Check second iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    // Check third iframe:
    $session->elementExists('css', '#testid3');
    $session->elementAttributeExists('css', '#testid3', 'src');
    $session->elementAttributeNotExists('css', '#testid3', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
  }

  /**
   * Tests the iframe placeholder none, with a set element selector.
   */
  public function testIframeBlockingPlaceholderNoneElementSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => 'iframe.blocked',
      'placeholderBehaviour' => 'none',
    ]);
    $cookiesFilterEntity->save();
    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="blocked" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="notBlocked" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    // Check all values for blocked iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for not blocked iframe:
    $session->elementExists('css', 'iframe#testid2');
    $session->elementAttributeExists('css', 'iframe#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'notBlocked');
    // See if classes don't exist:
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check values for blocked iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');

    // Check values for not blocked iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'notBlocked');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
  }

  /**
   * Tests the iframe placeholder none, with multiple element selector.
   */
  public function testIframeBlockingPlaceholderNoneMultipleElementSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => "iframe.blocked\niframe.blockedAswell",
      'placeholderBehaviour' => 'none',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="blocked" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="blockedAswell" src="demo_iframe.html"></iframe>
                    <iframe id="testid3" class="blocked blockedAswell" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'iframe#testid2');

    // Check all values for first iframe:
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for second blocked iframe:
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Check all values for third blocked iframe:
    $session->elementAttributeNotExists('css', '#testid3', 'src');
    $session->elementAttributeExists('css', 'iframe#testid3', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blockedAswell');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid3');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
        document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check values for blocked iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');

    // Check values second blocked iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');

    // Check values third blocked iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid3', 'src');
    $session->elementAttributeNotExists('css', '#testid3', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blockedAswell');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
  }

  /**
   * Tests iframe placeholder none, with a set element selector and two filters.
   */
  public function testIframeBlockingPlaceholderNoneElementSelectorTwoFilterServices() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => 'iframe.blocked',
      'placeholderBehaviour' => 'none',
    ]);
    $cookiesFilterEntity->save();

    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test2',
      'label' => 'test2',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => 'iframe.blockedAswell',
      'placeholderBehaviour' => 'none',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="blocked" src="demo_iframe.html"></iframe> <iframe id="testid2" class="blockedAswell" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'iframe#testid2');
    // Check all values for blocked iframe:
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for second blocked iframe:
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check values for blocked iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');

    // Check values for other blocked iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
  }

  /**
   * Tests iframe placeh. none, with set element selector and identical filters.
   */
  public function testIframeBlockingPlaceholderNoneIdenticalFilterServices() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'none',
    ]);
    $cookiesFilterEntity->save();

    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test2',
      'label' => 'test2',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'none',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" src="demo_iframe.html"></iframe> <iframe id="testid2" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'iframe#testid2');
    // Check all values for blocked iframe:
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for second blocked iframe:
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check values for blocked iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');

    // Check values for other blocked iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
  }

  /**
   * Tests basic iframe blocking functionalities with placeholder "hide".
   */
  public function testIframeBlockingPlaceholderHideBasic() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid', 'class', 'hidden');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');
  }

  /**
   * Tests mutliple iframes with placeholder "hide".
   */
  public function testIframeBlockingPlaceholderHideMultiple() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="testClass" src="demo_iframe.html"></iframe>
                    <iframe id="testid3" class="testClass" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());

    // Check first iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check second iframe:
    $session->elementExists('css', 'iframe#testid2');
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid2', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Check third iframe:
    $session->elementExists('css', 'iframe#testid3');
    $session->elementAttributeNotExists('css', '#testid3', 'src');
    $session->elementAttributeExists('css', 'iframe#testid3', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid3', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid3');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframes are unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    // Check first iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');
    // Check second iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'hidden');
    // Check third iframe:
    $session->elementExists('css', '#testid3');
    $session->elementAttributeExists('css', '#testid3', 'src');
    $session->elementAttributeNotExists('css', '#testid3', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'hidden');
  }

  /**
   * Tests the iframe placeholder hide, with a set element selector.
   */
  public function testIframeBlockingPlaceholderHideElementSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => 'iframe.blocked',
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();
    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="blocked" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="notBlocked" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    // Check all values for blocked iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for not blocked iframe:
    $session->elementExists('css', 'iframe#testid2');
    $session->elementAttributeExists('css', 'iframe#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'notBlocked');
    // See if classes don't exist:
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check values for blocked iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');

    // Check values for not blocked iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'notBlocked');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'hidden');
  }

  /**
   * Tests the iframe placeholder hide, with multiple element selector.
   */
  public function testIframeBlockingPlaceholderHideMultipleElementSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => "iframe.blocked\niframe.blockedAswell",
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="blocked" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="blockedAswell" src="demo_iframe.html"></iframe>
                    <iframe id="testid3" class="blocked blockedAswell" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'iframe#testid2');

    // Check all values for first iframe:
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for second blocked iframe:
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid2', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Check all values for third blocked iframe:
    $session->elementAttributeNotExists('css', '#testid3', 'src');
    $session->elementAttributeExists('css', 'iframe#testid3', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blockedAswell');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid3', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid3');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
        document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check values for blocked iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');

    // Check values second blocked iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'hidden');

    // Check values third blocked iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid3', 'src');
    $session->elementAttributeNotExists('css', '#testid3', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blockedAswell');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'hidden');
  }

  /**
   * Tests iframe placeholder hide, with a set element selector and two filters.
   */
  public function testIframeBlockingPlaceholderHideElementSelectorTwoFilterServices() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => 'iframe.blocked',
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();

    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test2',
      'label' => 'test2',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => 'iframe.blockedAswell',
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="blocked" src="demo_iframe.html"></iframe> <iframe id="testid2" class="blockedAswell" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'iframe#testid2');
    // Check all values for blocked iframe:
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for second blocked iframe:
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid2', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check values for blocked iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');

    // Check values for other blocked iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'hidden');
  }

  /**
   * Tests iframe placeh. hide, with set element selector and identical filters.
   */
  public function testIframeBlockingPlaceholderHideIdenticalFilterServices() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();

    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test2',
      'label' => 'test2',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" src="demo_iframe.html"></iframe> <iframe id="testid2" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'iframe#testid2');
    // Check all values for blocked iframe:
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for second blocked iframe:
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testid2', 'class', 'hidden');
    // See if it has no placeholder class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check values for blocked iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');

    // Check values for other blocked iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
  }

  /**
   * Tests iframe blocking placeholder "hide" and custom selector.
   */
  public function testIframePlaceholderHideCustomSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderCustomElementSelectors' => 'div.specificDiv',
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>
                    <div id="testDiv" class="specificDiv"></div>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'div#testDiv');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');

    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check that usual iframe classes are set on custom selector instead:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-custom');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'hidden');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    // Check element:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');
    // Check custom selector element:
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-custom');
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'hidden');
  }

  /**
   * Tests if multiple iframes use the same custom selector as target to hide.
   */
  public function testMultipleIframePlaceholderHideCustomSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderCustomElementSelectors' => 'div.specificDiv',
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="testClass" src="demo_iframe.html"></iframe>
                    <div id="testDiv" class="specificDiv"></div>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'div#testDiv');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist for first iframe:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // See if classes exist for second iframe:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Check that usual iframe classes are set on custom selector instead:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'hidden');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-custom');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'hidden');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    // Check first element:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');
    // Check second element:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'hidden');
    // Check custom selector element:
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-custom');
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'hidden');
  }

  /**
   * Tests if multiple iframes use the same custom selector as target to hide.
   */
  public function testIframePlaceholderHideOnMultipleCustomSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderCustomElementSelectors' => "div#testDiv\ndiv#testDiv2",
      'placeholderBehaviour' => 'hide',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>
                    <div id="testDiv"div>
                    <div id="testDiv2"></div>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'div#testDiv');
    $session->elementExists('css', 'div#testDiv2');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist for first iframe:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check that usual iframe classes are set on custom selector instead:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // Check first div:
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-custom');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'hidden');
    // Check second div:
    $session->elementAttributeContains('css', '#testDiv2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeContains('css', '#testDiv2', 'class', 'cookies-filter-custom');
    $session->elementAttributeContains('css', '#testDiv2', 'class', 'hidden');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    // Check element:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'hidden');
    // Check first custom selector element:
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-custom');
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'hidden');
    // Check second custom selector element:
    $session->elementAttributeNotContains('css', '#testDiv2', 'class', 'cookies-filter-placeholder-type-hidden');
    $session->elementAttributeNotContains('css', '#testDiv2', 'class', 'cookies-filter-custom');
    $session->elementAttributeNotContains('css', '#testDiv2', 'class', 'hidden');
  }

  /**
   * Tests basic iframe blocking functionalities with placeholder "overlay".
   */
  public function testIframeBlockingPlaceholderOverlayBasic() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid');
    // See if there is an overlay inside the wrapper:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > div.cookies-fallback.cookies-fallback--functional.cookies-fallback--functional--overlay');
    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');
  }

  /**
   * Tests mutliple iframes with placeholder "overlay".
   */
  public function testIframeBlockingPlaceholderOverlayMultiple() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="testClass" src="demo_iframe.html"></iframe>
                    <iframe id="testid3" class="testClass" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());

    // Check first iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check second iframe:
    $session->elementExists('css', 'iframe#testid2');
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Check third iframe:
    $session->elementExists('css', 'iframe#testid3');
    $session->elementAttributeNotExists('css', '#testid3', 'src');
    $session->elementAttributeExists('css', 'iframe#testid3', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid3');

    // See if there are 3 overlay wrappers:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap > div.cookies-fallback.cookies-fallback--functional.cookies-fallback--functional--overlay', 3);

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframes are unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    // Check first iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check second iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Check third iframe:
    $session->elementExists('css', '#testid3');
    $session->elementAttributeExists('css', '#testid3', 'src');
    $session->elementAttributeNotExists('css', '#testid3', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid3');

    // See if there are no overlay wrappers left:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap', 0);
  }

  /**
   * Tests the iframe placeholder overlay, with a set element selector.
   */
  public function testIframeBlockingPlaceholderOverlayElementSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => 'iframe.blocked',
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();
    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="blocked" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="notBlocked" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    // Check all values for blocked iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for not blocked iframe:
    $session->elementExists('css', 'iframe#testid2');
    $session->elementAttributeExists('css', 'iframe#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'notBlocked');
    // See if classes don't exist:
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check blocked iframe:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check unblocked iframe:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'notBlocked');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');
  }

  /**
   * Tests the iframe placeholder overlay, with multiple element selector.
   */
  public function testIframeBlockingPlaceholderOverlayMultipleElementSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => "iframe.blocked\niframe.blockedAswell",
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="blocked" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="blockedAswell" src="demo_iframe.html"></iframe>
                    <iframe id="testid3" class="blocked blockedAswell" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'iframe#testid2');

    // Check all values for first iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for second blocked iframe:
    $session->elementExists('css', 'iframe#testid2');
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Check all values for third blocked iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid3', 'src');
    $session->elementAttributeExists('css', 'iframe#testid3', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blockedAswell');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid3');

    // See if there are 3 overlay wrappers:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap > div.cookies-fallback.cookies-fallback--functional.cookies-fallback--functional--overlay', 3);

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
        document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check first iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check second iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // Check third iframe:
    $session->elementExists('css', '#testid3');
    $session->elementAttributeExists('css', '#testid3', 'src');
    $session->elementAttributeNotExists('css', '#testid3', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid3', 'class', 'blockedAswell');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid3', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid3', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid3');
  }

  /**
   * Tests iframe overlay, with set element selector and two filters.
   */
  public function testIframeBlockingPlaceholderOverlayElementSelectorTwoFilterServices() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => 'iframe.blocked',
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();

    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test2',
      'label' => 'test2',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => 'iframe.blockedAswell',
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="blocked" src="demo_iframe.html"></iframe> <iframe id="testid2" class="blockedAswell" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'iframe#testid2');

    // Check all values for first iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for second blocked iframe:
    $session->elementExists('css', 'iframe#testid2');
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // See if there are 2 overlay wrappers:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap > div.cookies-fallback.cookies-fallback--functional.cookies-fallback--functional--overlay', 2);

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check first iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'blocked');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check second iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'blockedAswell');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // See if there are no overlay wrappers left:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap', 0);
  }

  /**
   * Tests iframe placeh. overlay, set element selector and identical filters.
   */
  public function testIframeBlockingPlaceholderOverlayIdenticalFilterServices() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();

    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test2',
      'label' => 'test2',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" src="demo_iframe.html"></iframe> <iframe id="testid2" src="demo_iframe.html"></iframe>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'iframe#testid2');
    // Check all values for blocked iframe:
    // Check all values for first iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check all values for second blocked iframe:
    $session->elementExists('css', 'iframe#testid2');
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if it has no placeholder overlay class set:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-hidden');
    // See if there is a wrapper set:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // See if there are 2 overlay wrappers:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap', 2);

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());

    // Check first iframe:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check second iframe:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // See if there is no wrapper anymore:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');

    // See if there are no overlay wrappers:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap', 0);
  }

  /**
   * Tests iframe blocking placeholder "overlay" and custom selector.
   */
  public function testIframePlaceholderOverlayCustomSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderCustomElementSelectors' => 'div.specificDiv',
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>
                    <div id="testDiv" class="specificDiv"></div>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'div#testDiv');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // Check that usual iframe classes and wrappers are set on custom selector
    // instead:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-custom');
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testDiv');
    // See if there is an overlay inside the wrapper:
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > div.cookies-fallback.cookies-fallback--functional.cookies-fallback--functional--overlay');

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    // Check element:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // Check custom selector element:
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-custom');

    // See if wrapper is gone:
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > div.cookies-fallback.cookies-fallback--functional.cookies-fallback--functional--overlay');
  }

  /**
   * Tests if multiple iframes use same custom selector as target to overlay.
   */
  public function testMultipleIframePlaceholderOverlayCustomSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderCustomElementSelectors' => 'div.specificDiv',
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>
                    <iframe id="testid2" class="testClass" src="demo_iframe.html"></iframe>
                    <div id="testDiv" class="specificDiv"></div>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());

    // Check first iframe:
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'div#testDiv');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // Check that usual iframe classes and wrappers are set on custom selector
    // instead:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');

    // Check second iframe:
    $session->elementExists('css', 'iframe#testid2');
    $session->elementAttributeNotExists('css', '#testid2', 'src');
    $session->elementAttributeExists('css', 'iframe#testid2', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    // Check that usual iframe classes and wrappers are set on custom selector
    // instead:
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid2');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-custom');
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testDiv');

    // See if there is only one overlay wrapper:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap > div.cookies-fallback.cookies-fallback--functional.cookies-fallback--functional--overlay', 1);

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    // Check first element:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // Check second element:
    $session->elementExists('css', '#testid2');
    $session->elementAttributeExists('css', '#testid2', 'src');
    $session->elementAttributeNotExists('css', '#testid2', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid2', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid2', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid2', 'class', 'cookies-filter-placeholder-type-overlay');
    // Check custom selector element:
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-custom');

    // See if there are no overlay wrappers left:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap', 0);
  }

  /**
   * Tests if multiple iframes use same custom selector as target to overlay.
   */
  public function testIframePlaceholderOverlayOnMultipleCustomSelector() {
    $session = $this->assertSession();
    // Place the Cookie UI Block:
    $this->drupalPlaceBlock('cookies_ui_block');

    // Create a cookies_service_filter entity:
    $cookiesFilterEntity = CookiesServiceFilterEntity::create([
      'id' => 'test',
      'label' => 'test',
      'service' => 'functional',
      'elementType' => 'iframe',
      'elementSelectors' => '',
      'placeholderCustomElementSelectors' => "div#testDiv\ndiv#testDiv2",
      'placeholderBehaviour' => 'overlay',
    ]);
    $cookiesFilterEntity->save();

    // Create a node:
    $node = $this->createNode([
      'type' => 'article',
      'title' => 'test123',
      'body' => [
        'value' => '<iframe id="testid" class="testClass" src="demo_iframe.html"></iframe>
                    <div id="testDiv"div>
                    <div id="testDiv2"></div>',
        'format' => 'filter_test',
      ],
    ]);
    // Go to the created node and check if the iframe gets knocked out:
    $this->drupalGet('/node/' . $node->id());
    $session->elementExists('css', 'iframe#testid');
    $session->elementExists('css', 'div#testDiv');
    $session->elementAttributeNotExists('css', '#testid', 'src');
    $session->elementAttributeExists('css', 'iframe#testid', 'data-src');
    // See if classes exist:
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    // Check that usual iframe classes and wrappers are set on custom selector
    // instead:
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementNotExists('css', 'div.cookies-fallback--functional--wrap > #testid');
    // Check first div:
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeContains('css', '#testDiv', 'class', 'cookies-filter-custom');
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testDiv');

    // Check second div:
    $session->elementAttributeContains('css', '#testDiv2', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeContains('css', '#testDiv2', 'class', 'cookies-filter-custom');
    $session->elementExists('css', 'div.cookies-fallback--functional--wrap > #testDiv2');

    // See if there is only one overlay wrapper:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap > div.cookies-fallback.cookies-fallback--functional.cookies-fallback--functional--overlay', 2);

    // Fire consent script, accept all cookies:
    $script = "var options = { all: true };
      document.dispatchEvent(new CustomEvent('cookiesjsrSetService', { detail: options }));";
    // Go to the node and check if the iframe is unblocked:
    $this->getSession()->getDriver()->executeScript($script);
    $this->drupalGet('/node/' . $node->id());
    // Check element:
    $session->elementExists('css', '#testid');
    $session->elementAttributeExists('css', '#testid', 'src');
    $session->elementAttributeNotExists('css', '#testid', 'data-src');
    $session->elementAttributeContains('css', 'iframe#testid', 'class', 'testClass');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-processed');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-service--functional');
    $session->elementAttributeNotContains('css', 'iframe#testid', 'class', 'cookies-filter-replaced--src');
    $session->elementAttributeNotContains('css', '#testid', 'class', 'cookies-filter-placeholder-type-overlay');
    // Check first custom selector element:
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testDiv', 'class', 'cookies-filter-custom');
    // Check second custom selector element:
    $session->elementAttributeNotContains('css', '#testDiv2', 'class', 'cookies-filter-placeholder-type-overlay');
    $session->elementAttributeNotContains('css', '#testDiv2', 'class', 'cookies-filter-custom');

    // See if there are no overlay wrappers left:
    $session->elementsCount('css', 'div.cookies-fallback--functional--wrap', 0);
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc