View source
<?php
namespace Drupal\Tests\select2\FunctionalJavascript;
use Behat\Mink\Element\NodeElement;
use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\Tests\select2\Traits\Select2TestTrait;
abstract class Select2JavascriptTestBase extends WebDriverTestBase {
use Select2TestTrait;
protected $defaultTheme = 'stark';
protected static $modules = [
'node',
'select2',
'options',
];
public function setUp() {
parent::setUp();
$this
->drupalCreateContentType([
'type' => 'test',
]);
$user = $this
->drupalCreateUser([
'access content',
'edit own test content',
'create test content',
]);
$this
->drupalLogin($user);
}
protected function selectOption($field, array $keys) {
$this
->getSession()
->executeScript("jQuery('#{$field}').val(['" . implode("', '", $keys) . "'])");
$this
->getSession()
->executeScript("jQuery('#{$field}').trigger('change')");
}
protected function scrollElementInView($cssSelector) {
$this
->getSession()
->executeScript('
var viewPortHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
var element = jQuery(\'' . addcslashes($cssSelector, '\'') . '\');
var scrollTop = element.offset().top - (viewPortHeight/2);
var scrollableParent = jQuery.isFunction(element.scrollParent) ? element.scrollParent() : [];
if (scrollableParent.length > 0 && scrollableParent[0] !== document && scrollableParent[0] !== document.body) { scrollableParent[0].scrollTop = scrollTop } else { window.scroll(0, scrollTop); };
');
}
protected function dragDropElement(NodeElement $element, $offsetX, $offsetY) {
$this
->assertSession()
->assertWaitOnAjaxRequest();
$elemXpath = addslashes($element
->getXpath());
$jsCode = "var fireMouseEvent = function (type, element, x, y) {" . " var event = document.createEvent('MouseEvents');" . " event.initMouseEvent(type, true, (type !== 'mousemove'), window, 0, 0, 0, x, y, false, false, false, false, 0, element);" . " element.dispatchEvent(event); };";
$jsCode .= "(function() {" . " var dragElement = document.evaluate(\"{$elemXpath}\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" . " var pos = dragElement.getBoundingClientRect();" . " var centerX = Math.floor((pos.left + pos.right) / 2);" . " var centerY = Math.floor((pos.top + pos.bottom) / 2);" . " fireMouseEvent('mousedown', dragElement, centerX, centerY);" . " fireMouseEvent('mousemove', document, centerX + {$offsetX}, centerY + {$offsetY});" . " fireMouseEvent('mouseup', dragElement, centerX + {$offsetX}, centerY + {$offsetY});" . "})();";
$this
->getSession()
->executeScript($jsCode);
}
}