Skip to content
Snippets Groups Projects
Commit ec94aa2c authored by Stephen Mustgrave's avatar Stephen Mustgrave
Browse files

Resolve #3054538 "2x branch"

parent 8556728b
No related branches found
No related tags found
4 merge requests!38Issue #3468454,!37Issue #3468454,!32Issue #3199408 by mparker17, smustgrave, Wim Leers, Anybody: Migrate...,!25Resolve #3054538 "2x branch"
Pipeline #211021 passed
......@@ -125,6 +125,7 @@ function _extlink_get_settings_from_config(Config $config): array {
return [
'extTarget' => ((isset($settings['extlink_target'])) ? $settings['extlink_target'] : FALSE),
'extTargetAppendNewWindowLabel' => t('(opens in a new window)'),
'extTargetNoOverride' => ((isset($settings['extlink_target_no_override'])) ? $settings['extlink_target_no_override'] : FALSE),
'extNofollow' => ((isset($settings['extlink_nofollow'])) ? $settings['extlink_nofollow'] : FALSE),
'extNoreferrer' => ((isset($settings['extlink_noreferrer'])) ? $settings['extlink_noreferrer'] : FALSE),
......
......@@ -209,6 +209,19 @@
});
}
// Set the title attribute of all external links.
externalLinks.forEach((link, i) => {
const oldTitle = link.getAttribute('title');
let newTitle = drupalSettings.data.extlink.extTargetAppendNewWindowLabel;
if (oldTitle !== null) {
if (Drupal.extlink.hasNewWindowText(oldTitle)) {
return;
}
newTitle = Drupal.extlink.combineLabels(oldTitle, newTitle);
}
externalLinks[i].setAttribute('title', newTitle);
});
/* eslint:disable:no-empty */
Drupal.extlink = Drupal.extlink || {};
......@@ -234,6 +247,57 @@
});
};
/**
* Check if the label already has 'new window' text.
*
*
* @returns boolean
* @param label
*/
Drupal.extlink.hasNewWindowText = function (label) {
return label.toLowerCase().indexOf(Drupal.t('new window')) !== -1;
};
/**
* Combine two labels.
*
* Combine labels in a readable manner, taking into account if the label
* uses parenthesis or not. For examples,
*
* 1. "A" + "B" => "A, B"
* 2. "A" + "(B)" => "A (B)"
* 3. "(A)" + "B" => "B (A)"
* 4. "(A)" + "(B)" => "(A, B)"
*
*
* @returns string
* @param labelA
* @param labelB
*/
Drupal.extlink.combineLabels = function (labelA, labelB) {
labelA = labelA || '';
labelB = labelB || '';
const labelANoParens = labelA.trim().replace('(', '').replace(')', '');
const labelBNoParens = labelB.trim().replace('(', '').replace(')', '');
if (labelA === labelANoParens) {
if (labelB === labelBNoParens) {
// This is Example 1 above: "A" + "B" => "A, B"
return `${labelA}, ${labelB}`;
}
// This is Example 2 above: "A" + "(B)" => "A (B)"
return `${labelA} ${labelB}`;
}
if (labelB === labelBNoParens) {
// This is Example 3 above: "(A)" + "B" => "B (A)"
return `${labelB} ${labelA}`;
}
// This is Example 4 above: "(A)" + "(B)" => "(A, B)"
return `(${labelANoParens}, ${labelBNoParens})`;
};
/**
* Apply a class and a trailing <span> to all links not containing images.
*
......
......@@ -90,4 +90,58 @@ class ExtlinkTestTarget extends ExtlinkTestBase {
$this->assertTrue($link->getAttribute('rel') === 'noopener' || $link->getAttribute('rel') === 'noopener noreferrer' || $link->getAttribute('rel') === 'noreferrer noopener', 'ExtLink rel attribute is not "noopener".');
}
/**
* Checks to see if extlink adds (New Window) in the title.
*/
public function testExtlinkTargetNewWindow(): void {
// Target enabled.
$this->config('extlink.settings')->set('extlink_target', TRUE)->save();
// login.
$this->drupalLogin($this->adminUser);
// Create a node with an external link.
$settings = [
'type' => 'page',
'title' => 'test page',
'body' => [
[
'value' => '<p><a href="http://google.com">Google!</a><a href="http://google.com" title="My link title">Google with title!</a></p>',
'format' => $this->emptyFormat->id(),
],
],
];
$node = $this->drupalCreateNode($settings);
// Get the page.
$this->drupalGet($node->toUrl());
$page = $this->getSession()->getPage();
$this->assertTrue($page->hasLink('Google!'));
$this->assertTrue($page->hasLink('Google with title!'));
// Test that the page has the external link svg.
$externalLink = $page->find('xpath', self::EXTLINK_EXT_XPATH);
$this->assertTrue(!is_null($externalLink) && $externalLink->isVisible(), 'External Link does not exist.');
$link = $page->findLink('Google!');
// Link should have target attribute.
$this->assertTrue($link->getAttribute('target') === '_blank', 'Extlink target attribute is not "_blank".');
// Link should have rel attribute 'noopener noreferrer'.
$this->assertTrue($link->getAttribute('rel') === 'noopener' || $link->getAttribute('rel') === 'noopener noreferrer' || $link->getAttribute('rel') === 'noreferrer noopener', 'ExtLink rel attribute is not "noopener noreferrer".');
// Link should have a title '(New window)'.
$this->assertTrue($link->getAttribute('title') === '(opens in a new window)', 'ExtLink title attribute is not "(opens in a new window)".');
$link = $page->findLink('Google with title!');
// Link should have target attribute.
$this->assertTrue($link->getAttribute('target') === '_blank', 'ExtLink target attribute is not "_blank".');
// Link should have rel attribute 'noopener noreferrer'.
$this->assertTrue($link->getAttribute('rel') === 'noopener' || $link->getAttribute('rel') === 'noopener noreferrer' || $link->getAttribute('rel') === 'noreferrer noopener', 'ExtLink rel attribute is not "noopener noreferrer".');
// Link should have a title '(New window)'.
$this->assertStringContainsString('(opens in a new window)', $link->getAttribute('title'), 'ExtLink title attribute is not "(opens in a new window)".');
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment