Opened 10 years ago

Last modified 10 years ago

#11544 closed Bug

Placeholders should not be upcasted in parents not accepting spans — at Version 3

Reported by: Marcus Bointon Owned by:
Priority: Normal Milestone: CKEditor 4.3.4
Component: UI : Widgets Version: 4.3
Keywords: Cc:

Description (last modified by Piotrek Koszuliński)

New description

  1. Download and open 11544.html.
  2. Switch between modes.
  3. See that there's a mess in <title> tag.

Important note: While working on this issue other scenarios like placeholder used in <textarea> or <video> should be checked. Perhaps more parent tags should be excluded. The rule may be that placeholder may only be created in if, according to DTD, text node's parent accepts span.

Original description

This is related to #11223 and this forum post

I'm using the placeholder plugin in CKEditor 4.3.2, which generally works apart from two issues:

  • It doesn't allow it to be used in the root of the head tag (so for example you can't use placeholders to generate meta tags); placeholder get moved into the body tag.
  • Placeholder items in the title tag (and possibly elsewhere) get escaped incorrectly, and then fail to be unescaped on save, or when switching to/from source mode.

For example, starting by pasting this document into the source view:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
	<title>[[mytag1]]</title>
[[mytag2]]
</head>
<body>[[mytag3]]</body>
</html>

Switching to HTML view then back to source results in:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
	<title>&lt;span tabindex=&quot;-1&quot; contenteditable=&quot;false&quot; data-cke-widget-wrapper=&quot;1&quot; data-cke-filter=&quot;off&quot; class=&quot;cke_widget_wrapper cke_widget_new cke_widget_inline&quot; data-cke-display-name=&quot;placeholder&quot;&gt;&lt;span class=&quot;cke_placeholder&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;placeholder&quot;&gt;[[mytag1]]&lt;/span&gt;&lt;/span&gt;</title>
</head>
<body>[[mytag2]][[mytag3]]</body>
</html>

You can see an escaping wrapper has been applied in the title tag, and the [[mytag]] element in the head tag has been moved into the body.

Doing the same switch again results in:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
	<title>&lt;span tabindex=&quot;-1&quot; contenteditable=&quot;false&quot; data-cke-widget-wrapper=&quot;1&quot; data-cke-filter=&quot;off&quot; class=&quot;cke_widget_wrapper cke_widget_new cke_widget_inline&quot; data-cke-display-name=&quot;placeholder&quot;&gt;&lt;span class=&quot;cke_placeholder&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;placeholder&quot;&gt;&lt;span tabindex=&quot;-1&quot; contenteditable=&quot;false&quot; data-cke-widget-wrapper=&quot;1&quot; data-cke-filter=&quot;off&quot; class=&quot;cke_widget_wrapper cke_widget_new cke_widget_inline&quot; data-cke-display-name=&quot;placeholder&quot;&gt;&lt;span class=&quot;cke_placeholder&quot; data-cke-widget-keep-attr=&quot;0&quot; data-widget=&quot;placeholder&quot;&gt;[[mytag1]]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;</title>
</head>
<body>[[mytag2]][[mytag3]]</body>
</html>

It's now double-escaped, and this repeats each time you switch views or save.

For me this is a complete showstopper; I can't use CKEditor if it causes content explosions.

Change History (4)

comment:1 Changed 10 years ago by Piotrek Koszuliński

Keywords: placeholder source removed
Milestone: CKEditor 4.3.4
Status: newconfirmed
Version: 4.3.24.3

Placeholders cannot be used in <head>. You have to load correct HTML and <head> cannot contain text content. You could solve this with config.protectedSource but you'll need to use different pattern than for normal placeholders.

So the broken scenario is placeholder's format used in the <title>. See 11544.html. I also used there protectedSource to check if it correctly works in the <head> tag and everything looks fine. What's not fine is a mess in <title>.

While working on this issue other scenarios like placeholder used in <textarea> or <video> should be checked. Perhaps more parent tags should be excluded.

Last edited 10 years ago by Piotrek Koszuliński (previous) (diff)

Changed 10 years ago by Piotrek Koszuliński

Attachment: 11544.html added

comment:2 Changed 10 years ago by Marcus Bointon

That example HTML had a couple of problems, but I turned it into a minimal jsfiddle that reproduces the problem; just toggle the source button.

Note that I disabled protectedSource - placeholder alone triggers the issue.

comment:3 Changed 10 years ago by Piotrek Koszuliński

Description: modified (diff)
Summary: Wrong escaping in title tag, moving tags out of head with placeholdersPlaceholders should not be upcasted in parents not accepting spans

I know that placeholder alone triggers this issue. I wanted to show in 11544.html that if you want to use non-HTML strings in the <head> section you need to use protectedSource. Otherwise those strings will be pulled out to the <body>, which is a correct behaviour.

Note: See TracTickets for help on using tickets.
© 2003 – 2022, CKSource sp. z o.o. sp.k. All rights reserved. | Terms of use | Privacy policy