forked from a64f7bb4-7358-4778-9fbe-3b882c34cc1d/v1
171 lines
5.5 KiB
PHP
171 lines
5.5 KiB
PHP
<?php
|
|
|
|
namespace Drupal\FunctionalJavascriptTests;
|
|
|
|
use PHPUnit\Framework\AssertionFailedError;
|
|
|
|
/**
|
|
* Tests if we can execute JavaScript in the browser.
|
|
*
|
|
* @group javascript
|
|
*/
|
|
class BrowserWithJavascriptTest extends WebDriverTestBase {
|
|
|
|
/**
|
|
* Modules to enable.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected static $modules = ['test_page_test'];
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected $defaultTheme = 'stark';
|
|
|
|
public function testJavascript() {
|
|
$this->drupalGet('<front>');
|
|
$session = $this->getSession();
|
|
|
|
$session->resizeWindow(400, 300);
|
|
$javascript = <<<JS
|
|
(function(){
|
|
var w = window,
|
|
d = document,
|
|
e = d.documentElement,
|
|
g = d.getElementsByTagName('body')[0],
|
|
x = w.innerWidth || e.clientWidth || g.clientWidth,
|
|
y = w.innerHeight || e.clientHeight|| g.clientHeight;
|
|
return x == 400 && y == 300;
|
|
}())
|
|
JS;
|
|
$this->assertJsCondition($javascript);
|
|
|
|
// Ensure that \Drupal\Tests\UiHelperTrait::isTestUsingGuzzleClient() works
|
|
// as expected.
|
|
$this->assertFalse($this->isTestUsingGuzzleClient());
|
|
}
|
|
|
|
public function testAssertJsCondition() {
|
|
$this->drupalGet('<front>');
|
|
$session = $this->getSession();
|
|
|
|
$session->resizeWindow(500, 300);
|
|
$javascript = <<<JS
|
|
(function(){
|
|
var w = window,
|
|
d = document,
|
|
e = d.documentElement,
|
|
g = d.getElementsByTagName('body')[0],
|
|
x = w.innerWidth || e.clientWidth || g.clientWidth,
|
|
y = w.innerHeight || e.clientHeight|| g.clientHeight;
|
|
return x == 400 && y == 300;
|
|
}())
|
|
JS;
|
|
|
|
// We expected the following assertion to fail because the window has been
|
|
// re-sized to have a width of 500 not 400.
|
|
$this->expectException(AssertionFailedError::class);
|
|
$this->assertJsCondition($javascript, 100);
|
|
}
|
|
|
|
/**
|
|
* Tests creating screenshots.
|
|
*/
|
|
public function testCreateScreenshot() {
|
|
$this->drupalGet('<front>');
|
|
$this->createScreenshot('public://screenshot.jpg');
|
|
$this->assertFileExists('public://screenshot.jpg');
|
|
}
|
|
|
|
/**
|
|
* Tests assertEscaped() and assertUnescaped().
|
|
*
|
|
* @see \Drupal\Tests\WebAssert::assertNoEscaped()
|
|
* @see \Drupal\Tests\WebAssert::assertEscaped()
|
|
*/
|
|
public function testEscapingAssertions() {
|
|
$assert = $this->assertSession();
|
|
|
|
$this->drupalGet('test-escaped-characters');
|
|
$assert->assertNoEscaped('<div class="escaped">');
|
|
$assert->responseContains('<div class="escaped">');
|
|
$assert->assertEscaped('Escaped: <"\'&>');
|
|
|
|
$this->drupalGet('test-escaped-script');
|
|
$assert->assertNoEscaped('<div class="escaped">');
|
|
$assert->responseContains('<div class="escaped">');
|
|
$assert->assertEscaped("<script>alert('XSS');alert(\"XSS\");</script>");
|
|
|
|
$this->drupalGetWithAlert('test-unescaped-script');
|
|
$assert->assertNoEscaped('<div class="unescaped">');
|
|
$assert->responseContains('<div class="unescaped">');
|
|
$assert->responseContains("<script>alert('Marked safe');alert(\"Marked safe\");</script>");
|
|
$assert->assertNoEscaped("<script>alert('Marked safe');alert(\"Marked safe\");</script>");
|
|
}
|
|
|
|
/**
|
|
* Retrieves a Drupal path or an absolute path.
|
|
*
|
|
* @param string|\Drupal\Core\Url $path
|
|
* Drupal path or URL to load into Mink controlled browser.
|
|
* @param array $options
|
|
* (optional) Options to be forwarded to the URL generator.
|
|
* @param string[] $headers
|
|
* An array containing additional HTTP request headers, the array keys are
|
|
* the header names and the array values the header values. This is useful
|
|
* to set for example the "Accept-Language" header for requesting the page
|
|
* in a different language. Note that not all headers are supported, for
|
|
* example the "Accept" header is always overridden by the browser. For
|
|
* testing REST APIs it is recommended to obtain a separate HTTP client
|
|
* using getHttpClient() and performing requests that way.
|
|
*
|
|
* @return string
|
|
* The retrieved HTML string, also available as $this->getRawContent()
|
|
*
|
|
* @see \Drupal\Tests\BrowserTestBase::getHttpClient()
|
|
*/
|
|
protected function drupalGetWithAlert($path, array $options = [], array $headers = []) {
|
|
$options['absolute'] = TRUE;
|
|
$url = $this->buildUrl($path, $options);
|
|
|
|
$session = $this->getSession();
|
|
|
|
$this->prepareRequest();
|
|
foreach ($headers as $header_name => $header_value) {
|
|
$session->setRequestHeader($header_name, $header_value);
|
|
}
|
|
|
|
$session->visit($url);
|
|
|
|
// There are 2 alerts to accept before we can get the content of the page.
|
|
$session->getDriver()->getWebdriverSession()->accept_alert();
|
|
$session->getDriver()->getWebdriverSession()->accept_alert();
|
|
|
|
$out = $session->getPage()->getContent();
|
|
|
|
// Ensure that any changes to variables in the other thread are picked up.
|
|
$this->refreshVariables();
|
|
|
|
// Replace original page output with new output from redirected page(s).
|
|
if ($new = $this->checkForMetaRefresh()) {
|
|
$out = $new;
|
|
// We are finished with all meta refresh redirects, so reset the counter.
|
|
$this->metaRefreshCount = 0;
|
|
}
|
|
|
|
// Log only for WebDriverTestBase tests because for DrupalTestBrowser we log
|
|
// with ::getResponseLogHandler.
|
|
if ($this->htmlOutputEnabled && !$this->isTestUsingGuzzleClient()) {
|
|
$html_output = 'GET request to: ' . $url .
|
|
'<hr />Ending URL: ' . $this->getSession()->getCurrentUrl();
|
|
$html_output .= '<hr />' . $out;
|
|
$html_output .= $this->getHtmlOutputHeaders();
|
|
$this->htmlOutput($html_output);
|
|
}
|
|
|
|
return $out;
|
|
}
|
|
|
|
}
|