X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Feditor%2Fjs%2Feditor.js;h=6448953f190acd372154c2ec9d194fb1c189984d;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hp=2be16f57c5d116da2655a6804649746a8106d916;hpb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;p=yaffs-website
diff --git a/web/core/modules/editor/js/editor.js b/web/core/modules/editor/js/editor.js
index 2be16f57c..6448953f1 100644
--- a/web/core/modules/editor/js/editor.js
+++ b/web/core/modules/editor/js/editor.js
@@ -1,83 +1,68 @@
/**
- * @file
- * Attaches behavior for the Editor module.
- */
+* DO NOT EDIT THIS FILE.
+* See the following change record for more information,
+* https://www.drupal.org/node/2815083
+* @preserve
+**/
(function ($, Drupal, drupalSettings) {
-
- 'use strict';
-
- /**
- * Finds the text area field associated with the given text format selector.
- *
- * @param {jQuery} $formatSelector
- * A text format selector DOM element.
- *
- * @return {HTMLElement}
- * The text area DOM element, if it was found.
- */
function findFieldForFormatSelector($formatSelector) {
- var field_id = $formatSelector.attr('data-editor-for');
- // This selector will only find text areas in the top-level document. We do
- // not support attaching editors on text areas within iframes.
- return $('#' + field_id).get(0);
+ var fieldId = $formatSelector.attr('data-editor-for');
+
+ return $('#' + fieldId).get(0);
+ }
+
+ function filterXssWhenSwitching(field, format, originalFormatID, callback) {
+ if (format.editor.isXssSafe) {
+ callback(field, format);
+ } else {
+ $.ajax({
+ url: Drupal.url('editor/filter_xss/' + format.format),
+ type: 'POST',
+ data: {
+ value: field.value,
+ original_format_id: originalFormatID
+ },
+ dataType: 'json',
+ success: function success(xssFilteredValue) {
+ if (xssFilteredValue !== false) {
+ field.value = xssFilteredValue;
+ }
+ callback(field, format);
+ }
+ });
+ }
}
- /**
- * Changes the text editor on a text area.
- *
- * @param {HTMLElement} field
- * The text area DOM element.
- * @param {string} newFormatID
- * The text format we're changing to; the text editor for the currently
- * active text format will be detached, and the text editor for the new text
- * format will be attached.
- */
function changeTextEditor(field, newFormatID) {
var previousFormatID = field.getAttribute('data-editor-active-text-format');
- // Detach the current editor (if any) and attach a new editor.
if (drupalSettings.editor.formats[previousFormatID]) {
Drupal.editorDetach(field, drupalSettings.editor.formats[previousFormatID]);
- }
- // When no text editor is currently active, stop tracking changes.
- else {
- $(field).off('.editor');
- }
+ } else {
+ $(field).off('.editor');
+ }
- // Attach the new text editor (if any).
if (drupalSettings.editor.formats[newFormatID]) {
var format = drupalSettings.editor.formats[newFormatID];
filterXssWhenSwitching(field, format, previousFormatID, Drupal.editorAttach);
}
- // Store the new active format.
field.setAttribute('data-editor-active-text-format', newFormatID);
}
- /**
- * Handles changes in text format.
- *
- * @param {jQuery.Event} event
- * The text format change event.
- */
function onTextFormatChange(event) {
var $select = $(event.target);
var field = event.data.field;
var activeFormatID = field.getAttribute('data-editor-active-text-format');
var newFormatID = $select.val();
- // Prevent double-attaching if the change event is triggered manually.
if (newFormatID === activeFormatID) {
return;
}
- // When changing to a text format that has a text editor associated
- // with it that supports content filtering, then first ask for
- // confirmation, because switching text formats might cause certain
- // markup to be stripped away.
var supportContentFiltering = drupalSettings.editor.formats[newFormatID] && drupalSettings.editor.formats[newFormatID].editorSupportsContentFiltering;
- // If there is no content yet, it's always safe to change the text format.
+
var hasContent = field.value !== '';
if (hasContent && supportContentFiltering) {
var message = Drupal.t('Changing the text format to %text_format will permanently remove content that is not allowed in that text format.
Save your changes before switching the text format to avoid losing data.', {
@@ -87,68 +72,43 @@
title: Drupal.t('Change text format?'),
dialogClass: 'editor-change-text-format-modal',
resizable: false,
- buttons: [
- {
- text: Drupal.t('Continue'),
- class: 'button button--primary',
- click: function () {
- changeTextEditor(field, newFormatID);
- confirmationDialog.close();
- }
- },
- {
- text: Drupal.t('Cancel'),
- class: 'button',
- click: function () {
- // Restore the active format ID: cancel changing text format. We
- // cannot simply call event.preventDefault() because jQuery's
- // change event is only triggered after the change has already
- // been accepted.
- $select.val(activeFormatID);
- confirmationDialog.close();
- }
+ buttons: [{
+ text: Drupal.t('Continue'),
+ class: 'button button--primary',
+ click: function click() {
+ changeTextEditor(field, newFormatID);
+ confirmationDialog.close();
+ }
+ }, {
+ text: Drupal.t('Cancel'),
+ class: 'button',
+ click: function click() {
+ $select.val(activeFormatID);
+ confirmationDialog.close();
}
- ],
- // Prevent this modal from being closed without the user making a choice
- // as per http://stackoverflow.com/a/5438771.
+ }],
+
closeOnEscape: false,
- create: function () {
+ create: function create() {
$(this).parent().find('.ui-dialog-titlebar-close').remove();
},
+
beforeClose: false,
- close: function (event) {
- // Automatically destroy the DOM element that was used for the dialog.
+ close: function close(event) {
$(event.target).remove();
}
});
confirmationDialog.showModal();
- }
- else {
+ } else {
changeTextEditor(field, newFormatID);
}
}
- /**
- * Initialize an empty object for editors to place their attachment code.
- *
- * @namespace
- */
Drupal.editors = {};
- /**
- * Enables editors on text_format elements.
- *
- * @type {Drupal~behavior}
- *
- * @prop {Drupal~behaviorAttach} attach
- * Attaches an editor to an input element.
- * @prop {Drupal~behaviorDetach} detach
- * Detaches an editor from an input element.
- */
Drupal.behaviors.editor = {
- attach: function (context, settings) {
- // If there are no editor settings, there are no editors to enable.
+ attach: function attach(context, settings) {
if (!settings.editor) {
return;
}
@@ -157,58 +117,44 @@
var $this = $(this);
var field = findFieldForFormatSelector($this);
- // Opt-out if no supported text area was found.
if (!field) {
return;
}
- // Store the current active format.
var activeFormatID = $this.val();
field.setAttribute('data-editor-active-text-format', activeFormatID);
- // Directly attach this text editor, if the text format is enabled.
if (settings.editor.formats[activeFormatID]) {
- // XSS protection for the current text format/editor is performed on
- // the server side, so we don't need to do anything special here.
Drupal.editorAttach(field, settings.editor.formats[activeFormatID]);
}
- // When there is no text editor for this text format, still track
- // changes, because the user has the ability to switch to some text
- // editor, otherwise this code would not be executed.
+
$(field).on('change.editor keypress.editor', function () {
field.setAttribute('data-editor-value-is-changed', 'true');
- // Just knowing that the value was changed is enough, stop tracking.
+
$(field).off('.editor');
});
- // Attach onChange handler to text format selector element.
if ($this.is('select')) {
- $this.on('change.editorAttach', {field: field}, onTextFormatChange);
+ $this.on('change.editorAttach', { field: field }, onTextFormatChange);
}
- // Detach any editor when the containing form is submitted.
+
$this.parents('form').on('submit', function (event) {
- // Do not detach if the event was canceled.
if (event.isDefaultPrevented()) {
return;
}
- // Detach the current editor (if any).
+
if (settings.editor.formats[activeFormatID]) {
Drupal.editorDetach(field, settings.editor.formats[activeFormatID], 'serialize');
}
});
});
},
+ detach: function detach(context, settings, trigger) {
+ var editors = void 0;
- detach: function (context, settings, trigger) {
- var editors;
- // The 'serialize' trigger indicates that we should simply update the
- // underlying element with the new text, without destroying the editor.
if (trigger === 'serialize') {
- // Removing the editor-processed class guarantees that the editor will
- // be reattached. Only do this if we're planning to destroy the editor.
editors = $(context).find('[data-editor-for]').findOnce('editor');
- }
- else {
+ } else {
editors = $(context).find('[data-editor-for]').removeOnce('editor');
}
@@ -223,96 +169,25 @@
}
};
- /**
- * Attaches editor behaviors to the field.
- *
- * @param {HTMLElement} field
- * The textarea DOM element.
- * @param {object} format
- * The text format that's being activated, from
- * drupalSettings.editor.formats.
- *
- * @listens event:change
- *
- * @fires event:formUpdated
- */
Drupal.editorAttach = function (field, format) {
if (format.editor) {
- // Attach the text editor.
Drupal.editors[format.editor].attach(field, format);
- // Ensures form.js' 'formUpdated' event is triggered even for changes that
- // happen within the text editor.
Drupal.editors[format.editor].onChange(field, function () {
$(field).trigger('formUpdated');
- // Keep track of changes, so we know what to do when switching text
- // formats and guaranteeing XSS protection.
field.setAttribute('data-editor-value-is-changed', 'true');
});
}
};
- /**
- * Detaches editor behaviors from the field.
- *
- * @param {HTMLElement} field
- * The textarea DOM element.
- * @param {object} format
- * The text format that's being activated, from
- * drupalSettings.editor.formats.
- * @param {string} trigger
- * Trigger value from the detach behavior.
- */
Drupal.editorDetach = function (field, format, trigger) {
if (format.editor) {
Drupal.editors[format.editor].detach(field, format, trigger);
- // Restore the original value if the user didn't make any changes yet.
if (field.getAttribute('data-editor-value-is-changed') === 'false') {
field.value = field.getAttribute('data-editor-value-original');
}
}
};
-
- /**
- * Filter away XSS attack vectors when switching text formats.
- *
- * @param {HTMLElement} field
- * The textarea DOM element.
- * @param {object} format
- * The text format that's being activated, from
- * drupalSettings.editor.formats.
- * @param {string} originalFormatID
- * The text format ID of the original text format.
- * @param {function} callback
- * A callback to be called (with no parameters) after the field's value has
- * been XSS filtered.
- */
- function filterXssWhenSwitching(field, format, originalFormatID, callback) {
- // A text editor that already is XSS-safe needs no additional measures.
- if (format.editor.isXssSafe) {
- callback(field, format);
- }
- // Otherwise, ensure XSS safety: let the server XSS filter this value.
- else {
- $.ajax({
- url: Drupal.url('editor/filter_xss/' + format.format),
- type: 'POST',
- data: {
- value: field.value,
- original_format_id: originalFormatID
- },
- dataType: 'json',
- success: function (xssFilteredValue) {
- // If the server returns false, then no XSS filtering is needed.
- if (xssFilteredValue !== false) {
- field.value = xssFilteredValue;
- }
- callback(field, format);
- }
- });
- }
- }
-
-})(jQuery, Drupal, drupalSettings);
+})(jQuery, Drupal, drupalSettings);
\ No newline at end of file