\r
CKEDITOR.plugins.add( 'widget', {\r
// jscs:disable maximumLineLength\r
- lang: 'af,ar,az,bg,ca,cs,cy,da,de,de-ch,el,en,en-gb,eo,es,eu,fa,fi,fr,gl,he,hr,hu,id,it,ja,km,ko,ku,lv,nb,nl,no,oc,pl,pt,pt-br,ru,sk,sl,sq,sv,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%\r
+ lang: 'af,ar,az,bg,ca,cs,cy,da,de,de-ch,el,en,en-gb,eo,es,es-mx,eu,fa,fi,fr,gl,he,hr,hu,id,it,ja,km,ko,ku,lv,nb,nl,no,oc,pl,pt,pt-br,ru,sk,sl,sq,sv,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE%\r
// jscs:enable maximumLineLength\r
requires: 'lineutils,clipboard,widgetselection',\r
onLoad: function() {\r
'width:' + DRAG_HANDLER_SIZE + 'px;' +\r
'height:0;' +\r
// Initially drag handler should not be visible, until its position will be\r
- // calculated (#11177).\r
+ // calculated (http://dev.ckeditor.com/ticket/11177).\r
// We need to hide unpositined handlers, so they don't extend\r
- // widget's outline far to the left (#12024).\r
+ // widget's outline far to the left (http://dev.ckeditor.com/ticket/12024).\r
'display:none;' +\r
'opacity:0.75;' +\r
'transition:height 0s 0.2s;' + // Delay hiding drag handler.\r
- // Prevent drag handler from being misplaced (#11198).\r
+ // Prevent drag handler from being misplaced (http://dev.ckeditor.com/ticket/11198).\r
'line-height:0' +\r
'}' +\r
'.cke_widget_wrapper:hover>.cke_widget_drag_handler_container{' +\r
* @returns {Boolean} Whether an editable was successfully initialized.\r
*/\r
initEditable: function( editableName, definition ) {\r
- // Don't fetch just first element which matched selector but look for a correct one. (#13334)\r
+ // Don't fetch just first element which matched selector but look for a correct one. (http://dev.ckeditor.com/ticket/13334)\r
var editable = this._findOneNotNested( definition.selector );\r
\r
if ( editable && editable.is( CKEDITOR.dtd.$editable ) ) {\r
\r
/**\r
* Looks inside wrapper element to find a node that\r
- * matches given selector and is not nested in other widget. (#13334)\r
+ * matches given selector and is not nested in other widget. (http://dev.ckeditor.com/ticket/13334)\r
*\r
* @since 4.5\r
* @private\r
!isDirty && this.editor.resetDirty();\r
}\r
\r
- // Always focus editor (not only when focusManger.hasFocus is false) (because of #10483).\r
+ // Always focus editor (not only when focusManger.hasFocus is false) (because of http://dev.ckeditor.com/ticket/10483).\r
this.editor.focus();\r
},\r
\r
if ( oldPos && newPos.x == oldPos.x && newPos.y == oldPos.y )\r
return;\r
\r
- // We need to make sure that dirty state is not changed (#11487).\r
+ // We need to make sure that dirty state is not changed (http://dev.ckeditor.com/ticket/11487).\r
var initialDirty = editor.checkDirty();\r
\r
editor.fire( 'lockSnapshot' );\r
\r
// Remove widgets which have no corresponding elements in DOM.\r
for ( i in instances ) {\r
- // #13410 Remove widgets that are ready. This prevents from destroying widgets that are during loading process.\r
+ // http://dev.ckeditor.com/ticket/13410 Remove widgets that are ready. This prevents from destroying widgets that are during loading process.\r
if ( instances[ i ].isReady() && !editable.contains( instances[ i ].wrapper ) )\r
this.destroy( instances[ i ], true );\r
}\r
\r
// Check if:\r
// * there's no instance for this widget\r
- // * wrapper is not inside some temporary element like copybin (#11088)\r
+ // * wrapper is not inside some temporary element like copybin (http://dev.ckeditor.com/ticket/11088)\r
// * it was a nested widget's wrapper which has been detached from DOM,\r
// when nested editable has been initialized (it overwrites its innerHTML\r
// and initializes nested widgets).\r
// @returns {CKEDITOR.filter} Filter instance or `null` if rules are not defined.\r
// @context CKEDITOR.plugins.widget.repository\r
function createEditableFilter( widgetName, editableName, editableDefinition ) {\r
- if ( !editableDefinition.allowedContent )\r
+ if ( !editableDefinition.allowedContent && !editableDefinition.disallowedContent )\r
return null;\r
\r
var editables = this._.filters[ widgetName ];\r
\r
var filter = editables[ editableName ];\r
\r
- if ( !filter )\r
- editables[ editableName ] = filter = new CKEDITOR.filter( editableDefinition.allowedContent );\r
+ if ( !filter ) {\r
+ filter = editableDefinition.allowedContent ? new CKEDITOR.filter( editableDefinition.allowedContent ) : this.editor.filter.clone();\r
+\r
+ editables[ editableName ] = filter;\r
+\r
+ if ( editableDefinition.disallowedContent ) {\r
+ filter.disallow( editableDefinition.disallowedContent );\r
+ }\r
+ }\r
\r
return filter;\r
}\r
return false;\r
}\r
else if ( ( upcastsLength = upcasts.length ) ) {\r
- // Ignore elements with data-cke-widget-upcasted to avoid multiple upcasts (#11533).\r
+ // Ignore elements with data-cke-widget-upcasted to avoid multiple upcasts (http://dev.ckeditor.com/ticket/11533).\r
// Do not iterate over descendants.\r
if ( element.attributes[ 'data-cke-widget-upcasted' ] )\r
return false;\r
'(?:</(?:div|span)>)?' +\r
'(?:</(?:div|span)>)?' +\r
'$',\r
- // IE8 prefers uppercase when browsers stick to lowercase HTML (#13460).\r
+ // IE8 prefers uppercase when browsers stick to lowercase HTML (http://dev.ckeditor.com/ticket/13460).\r
'i'\r
);\r
\r
// IE needs focus.\r
editor.focus();\r
\r
- // and widget need to be focused on drag start (#12172#comment:10).\r
+ // and widget need to be focused on drag start (http://dev.ckeditor.com/ticket/12172#comment:10).\r
widget.focus();\r
}\r
} );\r
dragRange = editor.createRange(),\r
sourceWidget;\r
\r
- // Disable cross-editor drag & drop for widgets - #13599.\r
+ // Disable cross-editor drag & drop for widgets - http://dev.ckeditor.com/ticket/13599.\r
if ( id !== '' && transferType === CKEDITOR.DATA_TRANSFER_CROSS_EDITORS ) {\r
evt.cancel();\r
return;\r
if ( !el.is( CKEDITOR.dtd.$block ) )\r
return;\r
\r
- // Allow drop line inside, but never before or after nested editable (#12006).\r
+ // Allow drop line inside, but never before or after nested editable (http://dev.ckeditor.com/ticket/12006).\r
if ( Widget.isDomNestedEditable( el ) )\r
return;\r
\r
- // Do not allow droping inside the widget being dragged (#13397).\r
+ // Do not allow droping inside the widget being dragged (http://dev.ckeditor.com/ticket/13397).\r
if ( widgetsRepo._.draggedWidget.wrapper.contains( el ) ) {\r
return;\r
}\r
\r
- // If element is nested editable, make sure widget can be dropped there (#12006).\r
+ // If element is nested editable, make sure widget can be dropped there (http://dev.ckeditor.com/ticket/12006).\r
var nestedEditable = Widget.getNestedEditable( editable, el );\r
if ( nestedEditable ) {\r
var draggedWidget = widgetsRepo._.draggedWidget;\r
editable.attachListener( evtRoot, 'mousedown', function( evt ) {\r
var target = evt.data.getTarget();\r
\r
- // #10887 Clicking scrollbar in IE8 will invoke event with empty target object.\r
- if ( !target.type )\r
- return false;\r
+ // Clicking scrollbar in Chrome will invoke event with target object of document type (#663).\r
+ // In IE8 the target object will be empty (http://dev.ckeditor.com/ticket/10887).\r
+ // We need to check if target is a proper element.\r
+ widget = ( target instanceof CKEDITOR.dom.element ) ? widgetsRepo.getByElement( target ) : null;\r
\r
- widget = widgetsRepo.getByElement( target );\r
mouseDownOnDragHandler = 0; // Reset.\r
\r
// Widget was clicked, but not editable nested in it.\r
mouseDownOnDragHandler = 1;\r
\r
// When drag handler is pressed we have to clear current selection if it wasn't already on this widget.\r
- // Otherwise, the selection may be in a fillingChar, which prevents dragging a widget. (#13284, see comment 8 and 9.)\r
+ // Otherwise, the selection may be in a fillingChar, which prevents dragging a widget. (http://dev.ckeditor.com/ticket/13284, see comment 8 and 9.)\r
if ( widgetsRepo.focused != widget )\r
editor.getSelection().removeAllRanges();\r
\r
// Save the reference to this nested editable in the closest widget to be downcasted.\r
// Nested editables are downcasted in the successive toDataFormat to create an opportunity\r
// for dataFilter's "excludeNestedEditable" option to do its job (that option relies on\r
- // contenteditable="true" attribute) (#11372).\r
+ // contenteditable="true" attribute) (http://dev.ckeditor.com/ticket/11372).\r
toBeDowncasted[ toBeDowncasted.length - 1 ].editables[ attrs[ 'data-cke-widget-editable' ] ] = element;\r
\r
// Don't check children - there won't be next wrapper or nested editable which we\r
// If drag'n'drop kind of paste into nested editable (data.range), selection is set AFTER\r
// data is pasted, which means editor has no chance to change activeFilter's context.\r
// As a result, pasted data is filtered with default editor's filter instead of NE's and\r
- // funny things get inserted. Changing the filter by analysis of the paste range below (#13186).\r
+ // funny things get inserted. Changing the filter by analysis of the paste range below (http://dev.ckeditor.com/ticket/13186).\r
if ( data.range ) {\r
// Check if pasting into nested editable.\r
var nestedEditable = Widget.getNestedEditable( editor.editable(), data.range.startContainer );\r
} );\r
}\r
\r
- // Add a listener to data event that will set/change widget's label (#14539).\r
+ // Add a listener to data event that will set/change widget's label (http://dev.ckeditor.com/ticket/14539).\r
function setupA11yListener( widget ) {\r
// Note, the function gets executed in a context of widget instance.\r
function getLabelDefault() {\r
return;\r
\r
var editor = widget.editor,\r
- // Use getLast to find wrapper's direct descendant (#12022).\r
+ // Use getLast to find wrapper's direct descendant (http://dev.ckeditor.com/ticket/12022).\r
container = widget.wrapper.getLast( Widget.isDomDragHandlerContainer ),\r
img;\r
\r
- // Reuse drag handler if already exists (#11281).\r
+ // Reuse drag handler if already exists (http://dev.ckeditor.com/ticket/11281).\r
if ( container )\r
img = container.findOne( 'img' );\r
else {\r
widget.wrapper.append( container );\r
}\r
\r
- // Preventing page reload when dropped content on widget wrapper (#13015).\r
+ // Preventing page reload when dropped content on widget wrapper (http://dev.ckeditor.com/ticket/13015).\r
// Widget is not editable so by default drop on it isn't allowed what means that\r
// browser handles it (there's no editable#drop event). If there's no drop event we cannot block\r
// the drop, so page is reloaded. This listener enables drop on widget wrappers.\r
if ( !widget.mask )\r
return;\r
\r
- // Reuse mask if already exists (#11281).\r
+ // Reuse mask if already exists (http://dev.ckeditor.com/ticket/11281).\r
var img = widget.wrapper.findOne( '.cke_widget_mask' );\r
\r
if ( !img ) {\r
setupDataClassesListener( widget );\r
setupA11yListener( widget );\r
\r
- // #11145: [IE8] Non-editable content of widget is draggable.\r
+ // http://dev.ckeditor.com/ticket/11145: [IE8] Non-editable content of widget is draggable.\r
if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) {\r
widget.wrapper.on( 'dragstart', function( evt ) {\r
var target = evt.data.getTarget();\r
widget.on( 'doubleclick', function( evt ) {\r
if ( widget.edit() ) {\r
// We have to cancel event if edit method opens a dialog, otherwise\r
- // link plugin may open extra dialog (#12140).\r
+ // link plugin may open extra dialog (http://dev.ckeditor.com/ticket/12140).\r
evt.cancel();\r
}\r
} );\r
* This option is similar to {@link CKEDITOR.config#allowedContent} and one can\r
* use it to limit the editor features available in the nested editable.\r
*\r
+ * If no `allowedContent` is specified, the editable will use the editor default\r
+ * {@link CKEDITOR.editor#filter}.\r
+ *\r
* @property {CKEDITOR.filter.allowedContentRules} allowedContent\r
*/\r
\r
/**\r
- * Nested editable name displayed in elements path.\r
+ * The [Advanced Content Filter](#!/guide/dev_advanced_content_filter) rules\r
+ * which will be used to blacklist elements within this nested editable.\r
+ * This option is similar to {@link CKEDITOR.config#disallowedContent}.\r
+ *\r
+ * Note that `disallowedContent` work on top of the definition's {@link #allowedContent}.\r
+ *\r
+ * @since 4.7.3\r
+ * @property {CKEDITOR.filter.disallowedContentRules} disallowedContent\r
+ */\r
+\r
+/**\r
+ * Nested editable name displayed in the elements path.\r
*\r
* @property {String} pathName\r
*/\r