From 178886c87abc51f7372ecfe618f992cf9416f781 Mon Sep 17 00:00:00 2001 From: kagla Date: Tue, 22 Jun 2021 16:07:02 +0900 Subject: [PATCH 01/12] =?UTF-8?q?webp=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=95=A0=20=EC=88=98?= =?UTF-8?q?=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bbs/qawrite_update.php | 3 +- bbs/view_image.php | 2 +- bbs/write_update.php | 2 +- lib/get_data.lib.php | 2 +- lib/latest.lib.php | 2 +- lib/thumbnail.lib.php | 68 ++++++++++++++----- .../photo_uploader/popup/js/basic.js | 5 +- .../popup/php/UploadHandler.php | 28 ++++++-- .../popup/swfupload/handlers.js | 4 +- 9 files changed, 83 insertions(+), 33 deletions(-) diff --git a/bbs/qawrite_update.php b/bbs/qawrite_update.php index ab0b9b3a7..08c614e07 100644 --- a/bbs/qawrite_update.php +++ b/bbs/qawrite_update.php @@ -197,7 +197,8 @@ for ($i=1; $i<=$upload_count; $i++) { // image type if ( preg_match("/\.({$config['cf_image_extension']})$/i", $filename) || preg_match("/\.({$config['cf_flash_extension']})$/i", $filename) ) { - if ($timg['2'] < 1 || $timg['2'] > 16) + // webp 파일의 type 이 18 이므로 업로드가 가능하도록 수정 + if ($timg['2'] < 1 || $timg['2'] > 18) continue; } //================================================================= diff --git a/bbs/view_image.php b/bbs/view_image.php index c083a37e9..85c8d0afc 100644 --- a/bbs/view_image.php +++ b/bbs/view_image.php @@ -12,7 +12,7 @@ if(function_exists('clean_relative_paths')){ $extension = pathinfo($filename, PATHINFO_EXTENSION); -if ( ! preg_match('/(jpg|jpeg|png|gif|bmp)$/i', $extension) ){ +if ( ! preg_match('/(jpg|jpeg|png|gif|bmp|webp)$/i', $extension) ){ alert_close('이미지 확장자가 아닙니다.'); } diff --git a/bbs/write_update.php b/bbs/write_update.php index 8e01109a8..ac32277e6 100644 --- a/bbs/write_update.php +++ b/bbs/write_update.php @@ -532,7 +532,7 @@ if(isset($_FILES['bf_file']['name']) && is_array($_FILES['bf_file']['name'])) { // image type if ( preg_match("/\.({$config['cf_image_extension']})$/i", $filename) || preg_match("/\.({$config['cf_flash_extension']})$/i", $filename) ) { - if ($timg['2'] < 1 || $timg['2'] > 16) + if ($timg['2'] < 1 || $timg['2'] > 18) continue; } //================================================================= diff --git a/lib/get_data.lib.php b/lib/get_data.lib.php index b6e990a0b..9b92ebcd2 100644 --- a/lib/get_data.lib.php +++ b/lib/get_data.lib.php @@ -294,7 +294,7 @@ function get_thumbnail_find_cache($bo_table, $wr_id, $wr_key){ return get_write($write_table, $wr_id, true); } - return get_board_file_db($bo_table, $wr_id, 'bf_file, bf_content', "and bf_type between '1' and '3'", true); + return get_board_file_db($bo_table, $wr_id, 'bf_file, bf_content', "and bf_type in (1, 2, 3, 18) ", true); } function get_write_table_name($bo_table){ diff --git a/lib/latest.lib.php b/lib/latest.lib.php index 1d3613242..f21d80239 100644 --- a/lib/latest.lib.php +++ b/lib/latest.lib.php @@ -70,7 +70,7 @@ function latest($skin_dir='', $bo_table, $rows=10, $subject_len=40, $cache_time= } $list[$i] = get_list($row, $board, $latest_skin_url, $subject_len); - $list[$i]['first_file_thumb'] = (isset($row['wr_file']) && $row['wr_file']) ? get_board_file_db($bo_table, $row['wr_id'], 'bf_file, bf_content', "and bf_type between '1' and '3'", true) : array('bf_file'=>'', 'bf_content'=>''); + $list[$i]['first_file_thumb'] = (isset($row['wr_file']) && $row['wr_file']) ? get_board_file_db($bo_table, $row['wr_id'], 'bf_file, bf_content', "and bf_type in (1, 2, 3, 18) ", true) : array('bf_file'=>'', 'bf_content'=>''); $list[$i]['bo_table'] = $bo_table; // 썸네일 추가 if($options && is_string($options)) { diff --git a/lib/thumbnail.lib.php b/lib/thumbnail.lib.php index f983100ff..1150a221f 100644 --- a/lib/thumbnail.lib.php +++ b/lib/thumbnail.lib.php @@ -226,8 +226,18 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h if(!is_file($source_file)) // 원본 파일이 없다면 return; + $size = @getimagesize($source_file); - if(!isset($size[2]) || $size[2] < 1 || $size[2] > 3) // gif, jpg, png 에 대해서만 적용 + + $extensions = array(1 => 'gif', 2 => 'jpg', 3 => 'png', 18 => 'webp'); + $file_ext = $extensions[$size[2]]; // 파일 확장자 + + // gif, jpg, png, webp 에 대해서만 적용 + // if ( !(isset($size[2]) && ($size[2] == 1 || $size[2] == 2 || $size[2] == 3 || $size[2] == 18)) ) + // return; + + // $extensions 배열에 없는 확장자 라면 썸네일 만들지 않음 + if (!in_array($file_ext, $extensions)) return; if (!is_dir($target_path)) { @@ -240,16 +250,19 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h return ''; // Animated GIF는 썸네일 생성하지 않음 - if($size[2] == 1) { + if($file_ext === 'gif') { if(is_animated_gif($source_file)) return basename($source_file); + } else if ($file_ext === 'webp') { + if(is_animated_webp($source_file)) + return basename($source_file); } - $ext = array(1 => 'gif', 2 => 'jpg', 3 => 'png'); $thumb_filename = preg_replace("/\.[^\.]+$/i", "", $filename); // 확장자제거 - $thumb_file = "$target_path/thumb-{$thumb_filename}_{$thumb_width}x{$thumb_height}.".$ext[$size[2]]; - + // $thumb_file = "$target_path/thumb-{$thumb_filename}_{$thumb_width}x{$thumb_height}.".$ext[$size[2]]; + $thumb_file = "$target_path/thumb-{$thumb_filename}_{$thumb_width}x{$thumb_height}.".$file_ext; + $thumb_time = @filemtime($thumb_file); $source_time = @filemtime($source_file); @@ -263,10 +276,10 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h $src = null; $degree = 0; - if ($size[2] == 1) { + if ($file_ext === 'gif') { $src = @imagecreatefromgif($source_file); $src_transparency = @imagecolortransparent($src); - } else if ($size[2] == 2) { + } else if ($file_ext === 'jpg') { $src = @imagecreatefromjpeg($source_file); if(function_exists('exif_read_data')) { @@ -298,9 +311,12 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h } } } - } else if ($size[2] == 3) { + } else if ($file_ext === 'png') { $src = @imagecreatefrompng($source_file); @imagealphablending($src, true); + } else if ($file_ext === 'webp') { + $src = @imagecreatefromwebp($source_file); + @imagealphablending($src, true); } else { return; } @@ -363,10 +379,10 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h $dst = imagecreatetruecolor($dst_w, $dst_h); - if($size[2] == 3) { + if($file_ext === 'png') { imagealphablending($dst, false); imagesavealpha($dst, true); - } else if($size[2] == 1) { + } else if($file_ext === 'gif') { $palletsize = imagecolorstotal($src); if($src_transparency >= 0 && $src_transparency < $palletsize) { $transparent_color = imagecolorsforindex($src, $src_transparency); @@ -391,12 +407,12 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h } } - if($size[2] == 3) { + if($file_ext === 'png') { $bgcolor = imagecolorallocatealpha($dst, 0, 0, 0, 127); imagefill($dst, 0, 0, $bgcolor); imagealphablending($dst, false); imagesavealpha($dst, true); - } else if($size[2] == 1) { + } else if($file_ext === 'gif') { $palletsize = imagecolorstotal($src); if($src_transparency >= 0 && $src_transparency < $palletsize) { $transparent_color = imagecolorsforindex($src, $src_transparency); @@ -474,12 +490,12 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h } } - if($size[2] == 3) { + if($file_ext === 'png') { $bgcolor = imagecolorallocatealpha($dst, 0, 0, 0, 127); imagefill($dst, 0, 0, $bgcolor); imagealphablending($dst, false); imagesavealpha($dst, true); - } else if($size[2] == 1) { + } else if($file_ext === 'gif') { $palletsize = imagecolorstotal($src); if($src_transparency >= 0 && $src_transparency < $palletsize) { $transparent_color = imagecolorsforindex($src, $src_transparency); @@ -502,22 +518,24 @@ function thumbnail($filename, $source_path, $target_path, $thumb_width, $thumb_h UnsharpMask($dst, $val[0], $val[1], $val[2]); } - if($size[2] == 1) { + if($file_ext === 'gif') { imagegif($dst, $thumb_file); - } else if($size[2] == 3) { + } else if($file_ext === 'png') { if(!defined('G5_THUMB_PNG_COMPRESS')) $png_compress = 5; else $png_compress = G5_THUMB_PNG_COMPRESS; imagepng($dst, $thumb_file, $png_compress); - } else { + } else if ($file_ext === 'jpg') { if(!defined('G5_THUMB_JPG_QUALITY')) $jpg_quality = 90; else $jpg_quality = G5_THUMB_JPG_QUALITY; imagejpeg($dst, $thumb_file, $jpg_quality); + } else if ($file_ext === 'webp') { + imagewebp($dst, $thumb_file); } chmod($thumb_file, G5_FILE_PERMISSION); // 추후 삭제를 위하여 파일모드 변경 @@ -695,6 +713,22 @@ and the roundoff errors in the Gaussian blur process, are welcome. } +// 움직이는 webp 파일인지 검사한다. +// 출처) https://stackoverflow.com/questions/45190469/how-to-identify-whether-webp-image-is-static-or-animated?answertab=votes#tab-top +function is_animated_webp($filename) { + $contents = file_get_contents($filename); + $where = strpos($contents, "ANMF"); + if ($where !== false){ + // animated + $is_animated = true; + } + else{ + // non animated + $is_animated = false; + } + return $is_animated; +} + function is_animated_gif($filename) { static $cache = array(); diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/js/basic.js b/plugin/editor/smarteditor2/photo_uploader/popup/js/basic.js index b9094d285..b454a2970 100644 --- a/plugin/editor/smarteditor2/photo_uploader/popup/js/basic.js +++ b/plugin/editor/smarteditor2/photo_uploader/popup/js/basic.js @@ -22,7 +22,7 @@ jQuery(function ($) { dreg_area : '#drag_area', dreg_area_list : '#drag_area > ul', progress_bar : '#progress .progress-bar', - filter : /^(image\/bmp|image\/gif|image\/jpg|image\/jpeg|image\/png)$/i, + filter : /^(image\/bmp|image\/gif|image\/jpg|image\/jpeg|image\/png|image\/webp)$/i, files : [], file_limit : 10, //한번에 올릴수 파일갯수 제한 imgw : 100, @@ -102,8 +102,7 @@ jQuery(function ($) { } if (!index) { - node - .prepend('
') + node.prepend('
') .prepend($img); if(size_text){ node.append('
') diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php b/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php index d426df327..c0381ba6a 100644 --- a/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php +++ b/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php @@ -26,6 +26,7 @@ class UploadHandler "image/jpg" => array("imagecreatefromjpeg", "imagejpeg"), "image/jpeg" => array("imagecreatefromjpeg", "imagejpeg"), "image/png" => array("imagecreatefrompng", "imagepng"), + "image/webp" => array("imagecreatefromwebp", "imagewebp"), "image/bmp" => array("imagecreatefromwbmp", "imagewbmp") ); @@ -93,10 +94,10 @@ class UploadHandler // is enabled, set to 0 to disable chunked reading of files: 'readfile_chunk_size' => 10 * 1024 * 1024, // 10 MiB // Defines which files can be displayed inline when downloaded: - 'inline_file_types' => '/\.(gif|jpe?g|bmp|png)$/i', + 'inline_file_types' => '/\.(gif|jpe?g|bmp|png|webp)$/i', // Defines which files (based on their names) are accepted for upload: //'accept_file_types' => '/.+$/i', - 'accept_file_types' => '/\.(gif|jpe?g|bmp|png)$/i', + 'accept_file_types' => '/\.(gif|jpe?g|bmp|png|webp)$/i', // The php.ini settings upload_max_filesize and post_max_size // take precedence over the following max_file_size setting: 'max_file_size' => null, @@ -104,7 +105,7 @@ class UploadHandler // The maximum number of files for the upload directory: 'max_number_of_files' => null, // Defines which files are handled as image files: - 'image_file_types' => '/\.(gif|jpe?g|bmp|png)$/i', + 'image_file_types' => '/\.(gif|jpe?g|bmp|png|webp)$/i', 'is_resize' => (defined('SMARTEDITOR_UPLOAD_RESIZE') && SMARTEDITOR_UPLOAD_RESIZE) ? true : false, 'resize_max_width' => (defined('SMARTEDITOR_UPLOAD_MAX_WIDTH') && SMARTEDITOR_UPLOAD_MAX_WIDTH) ? SMARTEDITOR_UPLOAD_MAX_WIDTH : 800, 'resize_max_height' => (defined('SMARTEDITOR_UPLOAD_MAX_HEIGHT') && SMARTEDITOR_UPLOAD_MAX_HEIGHT) ? SMARTEDITOR_UPLOAD_MAX_HEIGHT : 800, @@ -498,7 +499,7 @@ class UploadHandler } // Add missing file extension for known image types: if (strpos($name, '.') === false && - preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) { + preg_match('/^image\/(gif|jpe?g|png|webp)/', $type, $matches)) { $name .= '.'.$matches[1]; } if (function_exists('exif_imagetype') && $file_path) { @@ -512,6 +513,9 @@ class UploadHandler case IMAGETYPE_GIF: $extensions = array('gif'); break; + case IMAGETYPE_WEBP: + $extensions = array('webp'); + break; } // Adjust incorrect image file extensions: if (!empty($extensions)) { @@ -688,7 +692,7 @@ class UploadHandler $src_func = 'imagecreatefromjpeg'; $write_func = 'imagejpeg'; $image_quality = isset($options['jpeg_quality']) ? - $options['jpeg_quality'] : 75; + $options['jpeg_quality'] : 75; break; case 'gif': $src_func = 'imagecreatefromgif'; @@ -699,7 +703,12 @@ class UploadHandler $src_func = 'imagecreatefrompng'; $write_func = 'imagepng'; $image_quality = isset($options['png_quality']) ? - $options['png_quality'] : 9; + $options['png_quality'] : 9; + break; + case 'webp': + $src_func = 'imagecreatefromwebp'; + $write_func = 'imagewebp'; + $image_quality = null; break; default: return false; @@ -1087,7 +1096,12 @@ class UploadHandler $image_from_file = self::$MIME_TYPES_PROCESSORS[$mime_type][0]; $image_to_file = self::$MIME_TYPES_PROCESSORS[$mime_type][1]; + // webp 의 경우 gd-webp cannot allocate temporary buffer 오류가 발생하여 webp 이미지가 업로드 되지 않을 수 있음 + // $reprocessed_image = imagecreatefromwebp($file_path); 이 코드로 웹서버의 error_log 에서 확인해 볼 수 있음 + // https://stackoverflow.com/questions/61394477/php-e-error-gd-webp-cannot-allocate-temporary-buffer + // 움직이는 webp 이미지나 큰사이즈의 webp 이미지에 대한 해결 방안은 아직 없는 것 같다 $reprocessed_image = @$image_from_file($file_path); + // error_log("\$image_from_file = '$image_from_file', \$image_to_file = '$image_to_file', \$reprocessed_image = '$reprocessed_image' "); if (!$reprocessed_image) { //throw new Exception("Unable to create reprocessed image from file"); @@ -1288,6 +1302,8 @@ class UploadHandler return 'image/png'; case 'gif': return 'image/gif'; + case 'webp': + return 'image/webp'; default: return ''; } diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/handlers.js b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/handlers.js index 01d7786d8..1dd85bb13 100644 --- a/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/handlers.js +++ b/plugin/editor/smarteditor2/photo_uploader/popup/swfupload/handlers.js @@ -287,7 +287,7 @@ function preview(thumb) { var thumb = file.bf_file; } - var pattern = /\.(jpg|png|gif)$/i; + var pattern = /\.(jpg|png|gif|webp)$/i; if (pattern.test(thumb)) { var thumb_kind = "img"; } else { @@ -321,7 +321,7 @@ function file_to_editor() { var file = get_file_info(files_list.options[i].value); var path = board_file_path + '/' + file.bf_file; - var pattern = /\.(jpg|png|gif)$/i; + var pattern = /\.(jpg|png|gif|webp)$/i; if (pattern.test(file.bf_file)) { if (wr_id) { html = "{이미지:" + file.bf_no + "}"; From 74798b93c16f31efd7d3cac7edfcce17ab5bce75 Mon Sep 17 00:00:00 2001 From: kagla Date: Tue, 22 Jun 2021 16:43:21 +0900 Subject: [PATCH 02/12] =?UTF-8?q?webp=20=ED=99=95=EC=9E=A5=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98=EC=97=AC=20=EC=9A=A9?= =?UTF-8?q?=EB=9F=89=20=ED=81=B0=20webp=20=ED=8C=8C=EC=9D=BC=EC=9D=B4=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=EB=90=98=EB=8A=94=20=EA=B2=83?= =?UTF-8?q?=EC=9D=84=20=ED=99=95=EC=9D=B8=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../smarteditor2/photo_uploader/popup/js/jquery.fileupload.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.fileupload.js b/plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.fileupload.js index 69430ecd9..128598335 100644 --- a/plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.fileupload.js +++ b/plugin/editor/smarteditor2/photo_uploader/popup/js/jquery.fileupload.js @@ -1283,8 +1283,8 @@ file_size_limit : "10 MB", file_upload_limit: 0, file_queue_limit : this.options.limit_filesLength, - file_types : "*.jpeg; *.bmp; *.png; *.jpg; *.gif", - file_types_description : "Image Files (JPG, JPEG, PNG, BMP, GIF)", + file_types : "*.jpeg; *.bmp; *.png; *.jpg; *.gif; *.webp", + file_types_description : "Image Files (JPG, JPEG, PNG, BMP, GIF, WEBP)", flash_url : "./swfupload/swfupload.swf", button_placeholder : this.options.fileInput[0], button_width : "100%", From 58f5e9b5cdab1704fdbede92844d176964b3d571 Mon Sep 17 00:00:00 2001 From: kagla Date: Wed, 23 Jun 2021 09:15:56 +0900 Subject: [PATCH 03/12] =?UTF-8?q?cheditor5=20=EC=97=90=20webp=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95.?= =?UTF-8?q?=20=EC=9B=80=EC=A7=81=EC=9D=B4=EB=8A=94=20gif,=20webp=20?= =?UTF-8?q?=EC=9D=98=20=EC=9D=B4=EB=AF=B8=EC=A7=80=EA=B0=80=20=EC=A0=95?= =?UTF-8?q?=EC=A7=80=EB=90=98=EC=96=B4=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EB=90=98=EA=B3=A0=20=EC=9E=88=EC=9D=8C.=20=EC=9B=90=EB=9E=98?= =?UTF-8?q?=20=EA=B7=B8=EB=9F=B0=EA=B2=83=20=EA=B0=99=EC=9D=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin/editor/cheditor5/imageUpload/upload.php | 6 ++++-- plugin/editor/cheditor5/popup/image.html5.html | 2 +- plugin/editor/cheditor5/popup/image.html5.m.html | 2 +- plugin/editor/cheditor5/popup/js/image.html5.js | 4 ++-- plugin/editor/cheditor5/popup/js/image.html5.m.js | 4 ++-- plugin/editor/cheditor5/popup/js/image.js | 2 +- plugin/editor/cheditor5/popup/js/image_url.js | 4 ++-- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/plugin/editor/cheditor5/imageUpload/upload.php b/plugin/editor/cheditor5/imageUpload/upload.php index 0d675e91b..9594f8c7a 100644 --- a/plugin/editor/cheditor5/imageUpload/upload.php +++ b/plugin/editor/cheditor5/imageUpload/upload.php @@ -9,10 +9,11 @@ if( !function_exists('che_reprocessImage') ){ function che_reprocessImage($file_path, $callback){ $MIME_TYPES_PROCESSORS = array( - "image/gif" => array("imagecreatefromgif", "imagegif"), + "image/gif" => array("imagecreatefromgif", "imagegif"), "image/jpg" => array("imagecreatefromjpeg", "imagejpeg"), "image/jpeg" => array("imagecreatefromjpeg", "imagejpeg"), - "image/png" => array("imagecreatefrompng", "imagepng"), + "image/png" => array("imagecreatefrompng", "imagepng"), + "image/webp" => array("imagecreatefromwebp", "imagewebp"), "image/bmp" => array("imagecreatefromwbmp", "imagewbmp") ); @@ -84,6 +85,7 @@ switch ($type) { case "jpeg": case "gif": case "png": + case "webp": $found = true; } diff --git a/plugin/editor/cheditor5/popup/image.html5.html b/plugin/editor/cheditor5/popup/image.html5.html index ed91fd34e..aceda6140 100644 --- a/plugin/editor/cheditor5/popup/image.html5.html +++ b/plugin/editor/cheditor5/popup/image.html5.html @@ -14,7 +14,7 @@
- image button diff --git a/plugin/editor/cheditor5/popup/image.html5.m.html b/plugin/editor/cheditor5/popup/image.html5.m.html index 0e88dd423..0f9debb67 100644 --- a/plugin/editor/cheditor5/popup/image.html5.m.html +++ b/plugin/editor/cheditor5/popup/image.html5.m.html @@ -14,7 +14,7 @@
- image button diff --git a/plugin/editor/cheditor5/popup/js/image.html5.js b/plugin/editor/cheditor5/popup/js/image.html5.js index 37b9a4559..40540d923 100644 --- a/plugin/editor/cheditor5/popup/js/image.html5.js +++ b/plugin/editor/cheditor5/popup/js/image.html5.js @@ -14,7 +14,7 @@ var activeImage = null, dragDropDiv, eventDiff_x = 0, eventDiff_y = 0, - fileTypeRe = /^image\/(png|jpeg|gif)$/i, + fileTypeRe = /^image\/(png|jpeg|gif|webp)$/i, geckoOffsetX_marker = -3, geckoOffsetY_marker = -1, imageCompleted = 0, @@ -434,7 +434,7 @@ function startUpload(list) { function fileFilterError(file) { alert("선택하신 '" + file + "' 파일은 전송할 수 없습니다.\n" + - "gif, png, jpg 사진 파일만 전송할 수 있습니다."); + "gif, png, jpg, webp 사진 파일만 전송할 수 있습니다."); } function imgComplete(img, imgSize, boxId) { diff --git a/plugin/editor/cheditor5/popup/js/image.html5.m.js b/plugin/editor/cheditor5/popup/js/image.html5.m.js index 67cedbf5d..c70470178 100644 --- a/plugin/editor/cheditor5/popup/js/image.html5.m.js +++ b/plugin/editor/cheditor5/popup/js/image.html5.m.js @@ -14,7 +14,7 @@ var activeImage = null, dragDropDiv, eventDiff_x = 0, eventDiff_y = 0, - fileTypeRe = /^image\/(png|jpeg|gif)$/i, + fileTypeRe = /^image\/(png|jpeg|gif|webp)$/i, geckoOffsetX_marker = -3, geckoOffsetY_marker = -1, imageCompleted = 0, @@ -434,7 +434,7 @@ function startUpload(list) { function fileFilterError(file) { alert("선택하신 '" + file + "' 파일은 전송할 수 없습니다.\n" + - "gif, png, jpg 사진 파일만 전송할 수 있습니다."); + "gif, png, jpg, webp 사진 파일만 전송할 수 있습니다."); } function imgComplete(img, imgSize, boxId) { diff --git a/plugin/editor/cheditor5/popup/js/image.js b/plugin/editor/cheditor5/popup/js/image.js index 7fc7c642f..706bfb413 100644 --- a/plugin/editor/cheditor5/popup/js/image.js +++ b/plugin/editor/cheditor5/popup/js/image.js @@ -335,7 +335,7 @@ function startUpload(count) { function fileFilterError(file) { alert("선택하신 '" + file + "' 파일은 전송할 수 없습니다.\n" + - "gif, png, jpg, 그림 파일만 전송할 수 있습니다."); + "gif, png, jpg, webp 그림 파일만 전송할 수 있습니다."); } function imgComplete(img, imgSize, boxId) { diff --git a/plugin/editor/cheditor5/popup/js/image_url.js b/plugin/editor/cheditor5/popup/js/image_url.js index fa5b85d7d..fd53e1582 100644 --- a/plugin/editor/cheditor5/popup/js/image_url.js +++ b/plugin/editor/cheditor5/popup/js/image_url.js @@ -54,7 +54,7 @@ function chkImgFormat (url) { var imageName = getFilename(url); var allowSubmit = false; - var extArray = [".gif", ".jpg", ".jpeg", ".png"]; + var extArray = [".gif", ".jpg", ".jpeg", ".png", ".webp"]; extArray.join(" "); if (imageName === "") { @@ -72,7 +72,7 @@ function chkImgFormat (url) } if (!allowSubmit) { - alert("사진은 GIF, JPG, PNG 형식만 넣을 수 있습니다."); + alert("사진은 GIF, JPG, PNG, WEBP 형식만 넣을 수 있습니다."); return false; } From c82add0eca2c77dcd1645b54d5e8e7eaff4f1228 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 24 Jun 2021 04:31:02 +0000 Subject: [PATCH 04/12] =?UTF-8?q?webp=20=EC=A7=80=EC=9B=90=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photo_uploader/popup/index.html | 105 +++---- .../photo_uploader/popup/js/basic.js | 281 +++++++++--------- 2 files changed, 194 insertions(+), 192 deletions(-) diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/index.html b/plugin/editor/smarteditor2/photo_uploader/popup/index.html index f695d9d02..da775dd2d 100644 --- a/plugin/editor/smarteditor2/photo_uploader/popup/index.html +++ b/plugin/editor/smarteditor2/photo_uploader/popup/index.html @@ -1,64 +1,67 @@ + - - -사진 첨부하기 :: SmartEditor2 - - - - - + + + 사진 첨부하기 :: SmartEditor2 + + + + + + -
- -
-

사진 첨부하기

-
- -
-
-

마우스로 드래그하여 순서를 바꿀수 있습니다.

-
- - 파일선택 - - - - +
+ +
+

사진 첨부하기

+
+ +
+
+

마우스로 드래그하여 순서를 바꿀수 있습니다.

+
+ + 파일선택 + + + + +
+
+
+
    +
+ 마우스로 드래그해서 이미지를 추가해주세요. +
+
이미지는 한번에 10개까지 선택할수 있습니다. 움직이는 webp 이미지는 업로드 불가합니다.
+
+ +
-
-
    -
- 마우스로 드래그해서 이미지를 추가해주세요. -
-
이미지는 한번에 10개까지 선택할수 있습니다.
-
- - -
-
- - - - + + + + - - + + - - + + + + + - - \ No newline at end of file diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/js/basic.js b/plugin/editor/smarteditor2/photo_uploader/popup/js/basic.js index b454a2970..96c7c0edd 100644 --- a/plugin/editor/smarteditor2/photo_uploader/popup/js/basic.js +++ b/plugin/editor/smarteditor2/photo_uploader/popup/js/basic.js @@ -1,9 +1,9 @@ -jQuery.fn.bindAll = function(options) { - var $this = this; - jQuery.each(options, function(key, val){ - $this.bind(key, val); - }); - return this; +jQuery.fn.bindAll = function (options) { + var $this = this; + jQuery.each(options, function (key, val) { + $this.bind(key, val); + }); + return this; } jQuery(function ($) { @@ -11,130 +11,130 @@ jQuery(function ($) { var ed_nonce = ''; - if( !!opener && !!opener.window && !!opener.window.nhn ){ + if (!!opener && !!opener.window && !!opener.window.nhn) { ed_nonce = opener.window.nhn.husky.SE2M_Configuration.SE2M_Accessibility.ed_nonce; } // Change this to the location of your server-side upload handler: var gnu = { - url : './php/?_nonce='+ed_nonce, - container_el : 'body', - dreg_area : '#drag_area', - dreg_area_list : '#drag_area > ul', - progress_bar : '#progress .progress-bar', - filter : /^(image\/bmp|image\/gif|image\/jpg|image\/jpeg|image\/png|image\/webp)$/i, - files : [], - file_limit : 10, //한번에 올릴수 파일갯수 제한 - imgw : 100, - imgh : 70, - file_api_support : !!(window.ProgressEvent && window.FileReader), - $elTextGuide : $("#guide_text"), - init : function(){ + url: './php/?_nonce=' + ed_nonce, + container_el: 'body', + dreg_area: '#drag_area', + dreg_area_list: '#drag_area > ul', + progress_bar: '#progress .progress-bar', + filter: /^(image\/bmp|image\/gif|image\/jpg|image\/jpeg|image\/png|image\/webp)$/i, + files: [], + file_limit: 10, //한번에 올릴수 파일갯수 제한 + imgw: 100, + imgh: 70, + file_api_support: !!(window.ProgressEvent && window.FileReader), + $elTextGuide: $("#guide_text"), + init: function () { $(this.dreg_area_list).sortable({ - 'cursor':'pointer', - 'placeholder':'placeholder' + 'cursor': 'pointer', + 'placeholder': 'placeholder' }); $(this.dreg_area_list).disableSelection(); - if( this.file_api_support ) this.$elTextGuide.removeClass("hidebg").addClass("showbg"); + if (this.file_api_support) this.$elTextGuide.removeClass("hidebg").addClass("showbg"); }, - file_push : function(file){ + file_push: function (file) { var othis = this, last = othis.files.length; othis.files.push(file); }, - _readymodebg : function(){ - if( this.file_api_support ) { + _readymodebg: function () { + if (this.file_api_support) { var sClass = this.$elTextGuide.attr('class'); - if(sClass.indexOf('hidebg') > 0){ + if (sClass.indexOf('hidebg') > 0) { this.$elTextGuide.removeClass('hidebg'); this.$elTextGuide.addClass('showbg'); } } }, - _startmodebg : function(){ - if( this.file_api_support ) { + _startmodebg: function () { + if (this.file_api_support) { var sClass = this.$elTextGuide.attr('class'); - if(sClass.indexOf('hidebg') < 0){ + if (sClass.indexOf('hidebg') < 0) { this.$elTextGuide.removeClass('showbg'); this.$elTextGuide.addClass('hidebg'); } } }, - _delete : function(e){ + _delete: function (e) { e.preventDefault(); var othis = gnu, $button = $(e.currentTarget), delete_url = $button.attr("data-delete"); - if( delete_url ){ + if (delete_url) { $.ajax({ - url: othis.url+"&del=1&file="+ delete_url + url: othis.url + "&del=1&file=" + delete_url }).done(function (result) { }); } - $button.parents('li.sort_list').fadeOut(300, function(){ + $button.parents('li.sort_list').fadeOut(300, function () { $(this).remove(); var $dreg_area = $(othis.dreg_area_list); $dreg_area.sortable('refresh'); - if( !$dreg_area.children('li').length ) othis._readymodebg(); + if (!$dreg_area.children('li').length) othis._readymodebg(); }); }, - _add : function(e, data, preload){ + _add: function (e, data, preload) { var othis = this; othis._startmodebg(); data.context = $('
  • ').addClass("sort_list").appendTo(this.dreg_area_list); $.each(data.files, function (index, file) { - if ( !preload && !othis.filter.test(file.type)) { + if (!preload && !othis.filter.test(file.type)) { data.context.remove(); alert('이미지만 허용합니다.'); return true; } var node = $('
    ') - .append($('').text(file.name)) - .append($('').addClass("delete_img").attr({"data-delete":file.name,"data-url":file.url}).html("삭제")), + .append($('').text(file.name)) + .append($('').addClass("delete_img").attr({ "data-delete": file.name, "data-url": file.url }).html("삭제")), $img = "", size_text = ''; - - if ( preload && preload != 'swfupload' ){ - var ret = othis.get_ratio( file.width, file.height ), - size_text = file.width+" x "+file.height; - $img = ""; - - } - if (!index) { - node.prepend('
    ') - .prepend($img); - if(size_text){ - node.append('
    ') + + if (preload && preload != 'swfupload') { + var ret = othis.get_ratio(file.width, file.height), + size_text = file.width + " x " + file.height; + $img = ""; + + } + if (!index) { + node.prepend('
    ') + .prepend($img); + if (size_text) { + node.append('
    ') .append($('').text(size_text)) - } } + } node.appendTo(data.context); node.find(".delete_img").on("click", othis._delete); }); $(othis.dreg_area_list).sortable('refresh'); }, - get_file_all : function(){ + get_file_all: function () { var othis = this, oDate = new Date(); $.ajax({ // Uncomment the following to send cross-domain cookies: //xhrFields: {withCredentials: true}, //url: $('#fileupload').fileupload('option', 'url'), - url: this.url+"&t="+ oDate.getTime(), + url: this.url + "&t=" + oDate.getTime(), dataType: 'json', context: $('#fileupload')[0] }).always(function () { //$(this).removeClass('fileupload-processing'); }).done(function (result) { $.each(result.files, function (index, data) { - var tmp = { files : [] }; + var tmp = { files: [] }; tmp.files[0] = data; - othis._add( $.Event('add'), tmp, 'preload' ); + othis._add($.Event('add'), tmp, 'preload'); }); }); }, - _processalways : function(e, data){ + _processalways: function (e, data) { var index = data.index, file = data.files[index], node = $(data.context.children()[index]); @@ -149,29 +149,29 @@ jQuery(function ($) { .prop('disabled', !!data.files.error); } }, - obj_to_arr : function(obj){ - var array = $.map(obj, function(value, index) { + obj_to_arr: function (obj) { + var array = $.map(obj, function (value, index) { return [value]; }); return array; }, - _done : function(e, data){ + _done: function (e, data) { var othis = this; $.each(data.result.files, function (index, file) { if (file.url && !file.error) { - var ret = othis.get_ratio( file.width, file.height ), + var ret = othis.get_ratio(file.width, file.height), node = $(data.context.children()[index]), - size_text = file.width+" x "+file.height, + size_text = file.width + " x " + file.height, //$img = "", link = $('') - .attr('target', '_blank') - .prop('href', file.url); - node - //.wrap(link) - .append('
    ') - .append($('').text(size_text)) - .find("img.pre_thumb").attr({"src":file.url,"width":ret['width'],"height":ret['height']}) - .end().find(".delete_img").attr({"data-delete":file.name,"data-url":file.url}); + .attr('target', '_blank') + .prop('href', file.url); + node + //.wrap(link) + .append('
    ') + .append($('').text(size_text)) + .find("img.pre_thumb").attr({ "src": file.url, "width": ret['width'], "height": ret['height'] }) + .end().find(".delete_img").attr({ "data-delete": file.name, "data-url": file.url }); } else if (file.error) { var error = $('').text(file.error); $(data.context.children()[index]) @@ -181,20 +181,20 @@ jQuery(function ($) { othis.file_push(file); }); }, - get_ratio : function(width, height){ + get_ratio: function (width, height) { var ratio = 0, ret_img = []; - if( !width || !height ){ + if (!width || !height) { ret_img['width'] = this.imgw; ret_img['height'] = this.imgh; return ret_img; } - if(width > this.imgw){ + if (width > this.imgw) { ratio = this.imgw / width; height = height * ratio; width = this.imgw; } - if( height > this.imgh ){ + if (height > this.imgh) { ratio = this.imgh / height; width = width * ratio; height = this.imgh; @@ -203,7 +203,7 @@ jQuery(function ($) { ret_img['height'] = parseInt(height); return ret_img; }, - setPhotoToEditor : function(oFileInfo){ + setPhotoToEditor: function (oFileInfo) { if (!!opener && !!opener.nhn && !!opener.nhn.husky && !!opener.nhn.husky.PopUpManager) { //스마트 에디터 플러그인을 통해서 넣는 방법 (oFileInfo는 Array) opener.nhn.husky.PopUpManager.setCallback(window, 'SET_PHOTO', [oFileInfo]); @@ -220,19 +220,19 @@ jQuery(function ($) { dropZone: $(gnu.dreg_area), autoUpload: true, sequentialUploads: true, - acceptFileTypes: /(\.|\/)(gif|jpe?g|bmp|png)$/i, + acceptFileTypes: /(\.|\/)(gif|jpe?g|bmp|png|webp)$/i, // Enable image resizing, except for Android and Opera, // which actually support image resizing, but fail to // send Blob objects via XHR requests: disableImageResize: true, - limit_filesLength : gnu.file_limit + limit_filesLength: gnu.file_limit }).on('fileuploadadd', function (e, data) { gnu._add(e, data); }).on('fileuploadprocessalways', function (e, data) { gnu._processalways(e, data); }).on('fileuploaddone', function (e, data) { - gnu._done( e, data ); + gnu._done(e, data); }).on('fileuploadfail', function (e, data) { $.each(data.files, function (index, file) { @@ -246,85 +246,84 @@ jQuery(function ($) { gnu.init(); - var listeners = { - data : {}, - log : false, - swfuploadLoaded: function(event){ - if(this.log) $('.log', this).append('
  • Loaded
  • '); - }, - fileQueued: function(event, file){ - if(this.log) $('.log', this).append('
  • File queued - '+file.name+'
  • '); - // start the upload once it is queued - // but only if this queue is not disabled - if (!$('input[name=disabled]:checked', this).length) { - $(this).swfupload('startUpload'); - } - }, - fileQueueError: function(event, file, errorCode, message){ - switch (errorCode) - { - case -100 : - alert("파일을 "+message+"개 이하로 선택해주세요."); + var listeners = { + data: {}, + log: false, + swfuploadLoaded: function (event) { + if (this.log) $('.log', this).append('
  • Loaded
  • '); + }, + fileQueued: function (event, file) { + if (this.log) $('.log', this).append('
  • File queued - ' + file.name + '
  • '); + // start the upload once it is queued + // but only if this queue is not disabled + if (!$('input[name=disabled]:checked', this).length) { + $(this).swfupload('startUpload'); + } + }, + fileQueueError: function (event, file, errorCode, message) { + switch (errorCode) { + case -100: + alert("파일을 " + message + "개 이하로 선택해주세요."); break; } - if(this.log) $('.log', this).append('
  • File queue error - '+message+'
  • '); - }, - fileDialogStart: function(event){ - if(this.log) $('.log', this).append('
  • File dialog start
  • '); - }, - fileDialogComplete: function(event, numFilesSelected, numFilesQueued){ - if(this.log) $('.log', this).append('
  • File dialog complete
  • '); - }, - uploadStart: function(event, file){ + if (this.log) $('.log', this).append('
  • File queue error - ' + message + '
  • '); + }, + fileDialogStart: function (event) { + if (this.log) $('.log', this).append('
  • File dialog start
  • '); + }, + fileDialogComplete: function (event, numFilesSelected, numFilesQueued) { + if (this.log) $('.log', this).append('
  • File dialog complete
  • '); + }, + uploadStart: function (event, file) { listeners.data.files = $.makeArray(file); - gnu._add( event, listeners.data, 'swfupload' ); - if(this.log) $('.log', this).append('
  • Upload start - '+file.name+'
  • '); - }, - uploadProgress: function(event, file, bytesLoaded){ - if(this.log) $('.log', this).append('
  • Upload progress - '+bytesLoaded+'
  • '); - }, - uploadSuccess: function(event, file, serverData){ - listeners.data.result = jQuery.parseJSON( serverData ); - gnu._done( event, listeners.data ); - if(this.log) $('.log', this).append('
  • Upload success - '+file.name+'
  • '); + gnu._add(event, listeners.data, 'swfupload'); + if (this.log) $('.log', this).append('
  • Upload start - ' + file.name + '
  • '); + }, + uploadProgress: function (event, file, bytesLoaded) { + if (this.log) $('.log', this).append('
  • Upload progress - ' + bytesLoaded + '
  • '); + }, + uploadSuccess: function (event, file, serverData) { + listeners.data.result = jQuery.parseJSON(serverData); + gnu._done(event, listeners.data); + if (this.log) $('.log', this).append('
  • Upload success - ' + file.name + '
  • '); - }, - uploadComplete: function(event, file){ - if(this.log) $('.log', this).append('
  • Upload complete - '+file.name+'
  • '); - // upload has completed, lets try the next one in the queue - // but only if this queue is not disabled - if (!$('input[name=disabled]:checked', this).length) { - $(this).swfupload('startUpload'); - } - }, - uploadError: function(event, file, errorCode, message){ - if(this.log) $('.log', this).append('
  • Upload error - '+message+'
  • '); - } - }; + }, + uploadComplete: function (event, file) { + if (this.log) $('.log', this).append('
  • Upload complete - ' + file.name + '
  • '); + // upload has completed, lets try the next one in the queue + // but only if this queue is not disabled + if (!$('input[name=disabled]:checked', this).length) { + $(this).swfupload('startUpload'); + } + }, + uploadError: function (event, file, errorCode, message) { + if (this.log) $('.log', this).append('
  • Upload error - ' + message + '
  • '); + } + }; - $(gnu.container_el).bindAll(listeners); + $(gnu.container_el).bindAll(listeners); /* listeners이벤트 */ $(gnu.dreg_area).bind('drop dragover', function (e) { e.preventDefault(); - if( !gnu.file_api_support && e.type == 'drop' ) alert("브라우저가 드래그 앤 드랍을 지원하지 않습니다."); + if (!gnu.file_api_support && e.type == 'drop') alert("브라우저가 드래그 앤 드랍을 지원하지 않습니다."); }); - $("#all_remove_btn").bind("click", function(e){ + $("#all_remove_btn").bind("click", function (e) { e.preventDefault(); - if( $(gnu.dreg_area_list).children().length ){ - if (confirm("추가한 이미지가 있습니다.정말 삭제 하시겠습니까?")){ - $(gnu.dreg_area_list).find(".delete_img").each( function(i){ + if ($(gnu.dreg_area_list).children().length) { + if (confirm("추가한 이미지가 있습니다.정말 삭제 하시겠습니까?")) { + $(gnu.dreg_area_list).find(".delete_img").each(function (i) { $(this).trigger("click"); }); $(gnu.dreg_area_list).sortable('refresh'); } } }); - $("#img_upload_submit").bind("click", function(e){ + $("#img_upload_submit").bind("click", function (e) { e.preventDefault(); - var aResult = [], j = 0; - $(gnu.dreg_area_list).find(".delete_img").each( function(i, f){ - if( !$(this).attr("data-url") ) return true; + var aResult = [], j = 0; + $(gnu.dreg_area_list).find(".delete_img").each(function (i, f) { + if (!$(this).attr("data-url")) return true; aResult[j] = []; aResult[j]['bNewLine'] = 'true'; aResult[j]['sAlign'] = ''; @@ -332,13 +331,13 @@ jQuery(function ($) { aResult[j]['sFileURL'] = $(this).attr("data-url"); j++; }); - if( aResult.length ){ + if (aResult.length) { gnu.setPhotoToEditor(aResult); aResult = null; } window.close(); }); - $("#close_w_btn").bind("click", function(e){ + $("#close_w_btn").bind("click", function (e) { e.preventDefault(); window.close(); }); From 8ac1d2524226c8121e1f7cdbac171965108e667e Mon Sep 17 00:00:00 2001 From: kagla Date: Fri, 25 Jun 2021 14:03:38 +0900 Subject: [PATCH 05/12] =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5=EC=9E=90=20=EC=83=81=EC=88=98=20=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config.php b/config.php index 36a1bfa64..73696aace 100644 --- a/config.php +++ b/config.php @@ -234,4 +234,6 @@ if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on') { //https 통신일때 define('G5_POSTCODE_JS', ''); } else { //http 통신일때 daum 주소 js define('G5_POSTCODE_JS', ''); -} \ No newline at end of file +} + +define('G5_IMAGE_EXTENSIONS', array(1=>'gif', 2=>'jpg', 3=>'png', 18=>'webp')); From bd33a31a10a9737887522c4f8e6564b126f01a40 Mon Sep 17 00:00:00 2001 From: kagla Date: Fri, 25 Jun 2021 14:03:45 +0900 Subject: [PATCH 06/12] =?UTF-8?q?=EC=9B=80=EC=A7=81=EC=9D=B4=EB=8A=94=20we?= =?UTF-8?q?bp=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=97=85=EB=A1=9C=EB=93=9C?= =?UTF-8?q?=20=EA=B0=80=EB=8A=A5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/thumbnail.lib.php | 22 +++++++++++++------ .../photo_uploader/popup/index.html | 8 +++---- .../popup/php/UploadHandler.php | 4 ++-- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/lib/thumbnail.lib.php b/lib/thumbnail.lib.php index 1150a221f..15eede63a 100644 --- a/lib/thumbnail.lib.php +++ b/lib/thumbnail.lib.php @@ -85,7 +85,7 @@ function get_file_thumbnail($file){ if( ! is_array($file) ) return ''; - if( preg_match('/(\.jpg|\.jpeg|\.gif|\.png|\.bmp)$/i', $file['file']) && $contents = run_replace('get_file_thumbnail_tags', '', $file) ){ + if( preg_match('/(\.jpg|\.jpeg|\.gif|\.png|\.bmp|\.webp)$/i', $file['file']) && $contents = run_replace('get_file_thumbnail_tags', '', $file) ){ return $contents; } else if ($file['view']) { return get_view_thumbnail($file['view']); @@ -108,6 +108,8 @@ function get_view_thumbnail($contents, $thumb_width=0) if(empty($matches)) return $contents; + // $extensions = array(1=>'gif', 2=>'jpg', 3=>'png', 18=>'webp'); + for($i=0; $i 'gif', 2 => 'jpg', 3 => 'png', 18 => 'webp'); - $file_ext = $extensions[$size[2]]; // 파일 확장자 + // $extensions = array(1 => 'gif', 2 => 'jpg', 3 => 'png', 18 => 'webp'); + // $file_ext = $extensions[$size[2]]; // 파일 확장자 + $file_ext = G5_IMAGE_EXTENSIONS[$size[2]]; + if (!$file_ext) return; // gif, jpg, png, webp 에 대해서만 적용 // if ( !(isset($size[2]) && ($size[2] == 1 || $size[2] == 2 || $size[2] == 3 || $size[2] == 18)) ) // return; // $extensions 배열에 없는 확장자 라면 썸네일 만들지 않음 - if (!in_array($file_ext, $extensions)) - return; + // if (!in_array($file_ext, $extensions)) + // return; if (!is_dir($target_path)) { @mkdir($target_path, G5_DIR_PERMISSION); diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/index.html b/plugin/editor/smarteditor2/photo_uploader/popup/index.html index da775dd2d..ddf0dcf74 100644 --- a/plugin/editor/smarteditor2/photo_uploader/popup/index.html +++ b/plugin/editor/smarteditor2/photo_uploader/popup/index.html @@ -55,13 +55,13 @@ - - + + - + - + \ No newline at end of file diff --git a/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php b/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php index c0381ba6a..8d26192a2 100644 --- a/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php +++ b/plugin/editor/smarteditor2/photo_uploader/popup/php/UploadHandler.php @@ -1092,7 +1092,7 @@ class UploadHandler //throw new Exception("Invalid image MIME type"); return false; } - + $image_from_file = self::$MIME_TYPES_PROCESSORS[$mime_type][0]; $image_to_file = self::$MIME_TYPES_PROCESSORS[$mime_type][1]; @@ -1101,7 +1101,7 @@ class UploadHandler // https://stackoverflow.com/questions/61394477/php-e-error-gd-webp-cannot-allocate-temporary-buffer // 움직이는 webp 이미지나 큰사이즈의 webp 이미지에 대한 해결 방안은 아직 없는 것 같다 $reprocessed_image = @$image_from_file($file_path); - // error_log("\$image_from_file = '$image_from_file', \$image_to_file = '$image_to_file', \$reprocessed_image = '$reprocessed_image' "); + // error_log("\$image_from_file = '$image_from_file', \$image_to_file = '$image_to_file', \$reprocessed_image = '$reprocessed_image', \$file_path ='$file_path' "); if (!$reprocessed_image) { //throw new Exception("Unable to create reprocessed image from file"); From f27e4c3c0cedcf02c693977c3cf4bd95f7fa4811 Mon Sep 17 00:00:00 2001 From: EC2 Default User Date: Fri, 25 Jun 2021 05:43:06 +0000 Subject: [PATCH 07/12] =?UTF-8?q?=EC=84=A4=EC=B9=98=EC=8B=9C=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=EC=84=A4=EC=A0=95=20>=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=99=95=EC=9E=A5=EC=9E=90?= =?UTF-8?q?=EC=97=90=20webp=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install/install_db.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/install_db.php b/install/install_db.php index 969703d70..c6077953a 100644 --- a/install/install_db.php +++ b/install/install_db.php @@ -197,7 +197,7 @@ if($g5_install || !$result) { cf_member_img_width = '60', cf_member_img_height = '60', cf_login_minutes = '10', - cf_image_extension = 'gif|jpg|jpeg|png', + cf_image_extension = 'gif|jpg|jpeg|png|webp', cf_flash_extension = 'swf', cf_movie_extension = 'asx|asf|wmv|wma|mpg|mpeg|mov|avi|mp3', cf_formmail_is_member = '1', From b3b92d4e1ce7a014e06d9c5389884b328299dfa6 Mon Sep 17 00:00:00 2001 From: kagla Date: Fri, 25 Jun 2021 11:26:13 +0000 Subject: [PATCH 08/12] cheditor4 first commit --- .gitignore | 2 +- plugin/editor/ckeditor4/CHANGES.md | 1637 +++++++++++++++++ plugin/editor/ckeditor4/LICENSE.md | 1420 ++++++++++++++ plugin/editor/ckeditor4/README.md | 39 + plugin/editor/ckeditor4/adapters/jquery.js | 10 + plugin/editor/ckeditor4/build-config.js | 96 + plugin/editor/ckeditor4/ckeditor.js | 1178 ++++++++++++ plugin/editor/ckeditor4/config.js | 91 + plugin/editor/ckeditor4/contents.css | 237 +++ plugin/editor/ckeditor4/darkmode.css | 1 + plugin/editor/ckeditor4/editor.lib.php | 121 ++ plugin/editor/ckeditor4/lang/en.js | 5 + plugin/editor/ckeditor4/lang/ja.js | 5 + plugin/editor/ckeditor4/lang/ko.js | 5 + plugin/editor/ckeditor4/lang/zh-cn.js | 5 + .../ckeditor4/plugins/about/dialogs/about.js | 8 + .../about/dialogs/hidpi/logo_ckeditor.png | Bin 0 -> 12236 bytes .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 5650 bytes .../plugins/clipboard/dialogs/paste.js | 11 + .../plugins/dialog/dialogDefinition.js | 4 + plugin/editor/ckeditor4/plugins/icons.png | Bin 0 -> 5626 bytes .../editor/ckeditor4/plugins/icons_hidpi.png | Bin 0 -> 16963 bytes .../ckeditor4/plugins/image/dialogs/image.js | 44 + .../plugins/image/images/noimage.png | Bin 0 -> 1610 bytes .../ckeditor4/plugins/link/dialogs/anchor.js | 8 + .../ckeditor4/plugins/link/dialogs/link.js | 30 + .../ckeditor4/plugins/link/images/anchor.png | Bin 0 -> 752 bytes .../plugins/link/images/hidpi/anchor.png | Bin 0 -> 1109 bytes .../magicline/images/hidpi/icon-rtl.png | Bin 0 -> 176 bytes .../plugins/magicline/images/hidpi/icon.png | Bin 0 -> 199 bytes .../plugins/magicline/images/icon-rtl.png | Bin 0 -> 138 bytes .../plugins/magicline/images/icon.png | Bin 0 -> 133 bytes .../showblocks/images/block_address.png | Bin 0 -> 152 bytes .../showblocks/images/block_blockquote.png | Bin 0 -> 154 bytes .../plugins/showblocks/images/block_div.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h1.png | Bin 0 -> 120 bytes .../plugins/showblocks/images/block_h2.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h3.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_h4.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_h5.png | Bin 0 -> 126 bytes .../plugins/showblocks/images/block_h6.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_p.png | Bin 0 -> 115 bytes .../plugins/showblocks/images/block_pre.png | Bin 0 -> 128 bytes .../ckeditor4/plugins/table/dialogs/table.js | 21 + .../tableselection/styles/tableselection.css | 36 + .../plugins/tabletools/dialogs/tableCell.js | 18 + .../ckeditor4/plugins/uploadimage/plugin.js | 203 ++ .../plugins/uploadwidget/dev/cors.html | 34 + .../uploadwidget/dev/filereaderplugin.js | 55 + .../plugins/uploadwidget/dev/upload.html | 97 + .../ckeditor4/plugins/uploadwidget/lang/az.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/bg.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/ca.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/cs.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/da.js | 12 + .../plugins/uploadwidget/lang/de-ch.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/de.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/el.js | 12 + .../plugins/uploadwidget/lang/en-au.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/en.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/eo.js | 12 + .../plugins/uploadwidget/lang/es-mx.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/es.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/et.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/eu.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/fa.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/fr.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/gl.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/hr.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/hu.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/id.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/it.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/ja.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/km.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/ko.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/ku.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/lv.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/nb.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/nl.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/no.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/oc.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/pl.js | 12 + .../plugins/uploadwidget/lang/pt-br.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/pt.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/ro.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/ru.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/sk.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/sq.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/sv.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/tr.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/ug.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/uk.js | 12 + .../plugins/uploadwidget/lang/zh-cn.js | 12 + .../ckeditor4/plugins/uploadwidget/lang/zh.js | 12 + .../ckeditor4/plugins/uploadwidget/plugin.js | 610 ++++++ .../plugins/widget/images/handle.png | Bin 0 -> 220 bytes .../editor/ckeditor4/samples/css/samples.css | 1637 +++++++++++++++++ .../ckeditor4/samples/img/github-top.png | Bin 0 -> 383 bytes .../ckeditor4/samples/img/header-bg.png | Bin 0 -> 13086 bytes .../samples/img/header-separator.png | Bin 0 -> 123 bytes plugin/editor/ckeditor4/samples/img/logo.png | Bin 0 -> 5634 bytes plugin/editor/ckeditor4/samples/img/logo.svg | 13 + .../ckeditor4/samples/img/navigation-tip.png | Bin 0 -> 12029 bytes plugin/editor/ckeditor4/samples/index.html | 128 ++ plugin/editor/ckeditor4/samples/js/sample.js | 53 + plugin/editor/ckeditor4/samples/js/sf.js | 17 + plugin/editor/ckeditor4/samples/old/ajax.html | 85 + plugin/editor/ckeditor4/samples/old/api.html | 210 +++ .../ckeditor4/samples/old/appendto.html | 59 + .../samples/old/assets/inlineall/logo.png | Bin 0 -> 4283 bytes .../old/assets/outputxhtml/outputxhtml.css | 204 ++ .../samples/old/assets/posteddata.php | 59 + .../ckeditor4/samples/old/assets/sample.jpg | Bin 0 -> 14449 bytes .../old/assets/uilanguages/languages.js | 7 + .../ckeditor4/samples/old/datafiltering.html | 508 +++++ .../samples/old/dialog/assets/my_dialog.js | 48 + .../ckeditor4/samples/old/dialog/dialog.html | 190 ++ .../ckeditor4/samples/old/divreplace.html | 144 ++ .../samples/old/enterkey/enterkey.html | 106 ++ .../assets/outputforflash/outputforflash.fla | Bin 0 -> 85504 bytes .../assets/outputforflash/outputforflash.swf | Bin 0 -> 15571 bytes .../assets/outputforflash/swfobject.js | 19 + .../old/htmlwriter/outputforflash.html | 283 +++ .../samples/old/htmlwriter/outputhtml.html | 224 +++ .../editor/ckeditor4/samples/old/index.html | 131 ++ .../ckeditor4/samples/old/inlineall.html | 314 ++++ .../ckeditor4/samples/old/inlinebycode.html | 124 ++ .../ckeditor4/samples/old/inlinetextarea.html | 113 ++ .../editor/ckeditor4/samples/old/jquery.html | 103 ++ .../samples/old/magicline/magicline.html | 209 +++ .../ckeditor4/samples/old/readonly.html | 76 + .../ckeditor4/samples/old/replacebyclass.html | 60 + .../ckeditor4/samples/old/replacebycode.html | 59 + .../editor/ckeditor4/samples/old/sample.css | 357 ++++ plugin/editor/ckeditor4/samples/old/sample.js | 50 + .../samples/old/sample_posteddata.php | 16 + .../ckeditor4/samples/old/tabindex.html | 78 + .../samples/old/toolbar/toolbar.html | 235 +++ .../editor/ckeditor4/samples/old/uicolor.html | 72 + .../ckeditor4/samples/old/uilanguages.html | 122 ++ .../samples/old/wysiwygarea/fullpage.html | 80 + .../ckeditor4/samples/old/xhtmlstyle.html | 234 +++ .../toolbarconfigurator/css/fontello.css | 55 + .../toolbarconfigurator/font/LICENSE.txt | 10 + .../toolbarconfigurator/font/config.json | 28 + .../toolbarconfigurator/font/fontello.eot | Bin 0 -> 4988 bytes .../toolbarconfigurator/font/fontello.svg | 14 + .../toolbarconfigurator/font/fontello.ttf | Bin 0 -> 4820 bytes .../toolbarconfigurator/font/fontello.woff | Bin 0 -> 2904 bytes .../samples/toolbarconfigurator/index.html | 446 +++++ .../js/abstracttoolbarmodifier.js | 13 + .../js/fulltoolbareditor.js | 9 + .../toolbarconfigurator/js/toolbarmodifier.js | 33 + .../js/toolbartextmodifier.js | 14 + .../lib/codemirror/LICENSE | 19 + .../lib/codemirror/codemirror.css | 325 ++++ .../lib/codemirror/codemirror.js | 288 +++ .../lib/codemirror/javascript.js | 25 + .../lib/codemirror/neo.css | 36 + .../lib/codemirror/show-hint.css | 38 + .../lib/codemirror/show-hint.js | 16 + .../ckeditor4/skins/moono-dark/dialog.css | 5 + .../ckeditor4/skins/moono-dark/dialog_ie.css | 5 + .../ckeditor4/skins/moono-dark/dialog_ie7.css | 5 + .../ckeditor4/skins/moono-dark/dialog_ie8.css | 5 + .../skins/moono-dark/dialog_iequirks.css | 5 + .../ckeditor4/skins/moono-dark/editor.css | 18 + .../skins/moono-dark/editor_gecko.css | 5 + .../ckeditor4/skins/moono-dark/editor_ie.css | 5 + .../ckeditor4/skins/moono-dark/editor_ie7.css | 5 + .../ckeditor4/skins/moono-dark/editor_ie8.css | 5 + .../skins/moono-dark/editor_iequirks.css | 5 + .../ckeditor4/skins/moono-dark/icons.png | Bin 0 -> 22920 bytes .../skins/moono-dark/icons_hidpi.png | Bin 0 -> 56674 bytes .../skins/moono-dark/images/arrow.png | Bin 0 -> 261 bytes .../skins/moono-dark/images/close.png | Bin 0 -> 720 bytes .../skins/moono-dark/images/hidpi/close.png | Bin 0 -> 1288 bytes .../moono-dark/images/hidpi/lock-open.png | Bin 0 -> 1107 bytes .../skins/moono-dark/images/hidpi/lock.png | Bin 0 -> 1154 bytes .../skins/moono-dark/images/hidpi/refresh.png | Bin 0 -> 1694 bytes .../skins/moono-dark/images/lock-open.png | Bin 0 -> 693 bytes .../skins/moono-dark/images/lock.png | Bin 0 -> 723 bytes .../skins/moono-dark/images/refresh.png | Bin 0 -> 886 bytes .../ckeditor4/skins/moono-dark/readme.md | 51 + .../editor/ckeditor4/skins/moono-dark/skin.js | 5 + .../ckeditor4/skins/office2013/dialog.css | 5 + .../ckeditor4/skins/office2013/editor.css | 1472 +++++++++++++++ .../ckeditor4/skins/office2013/icons.png | Bin 0 -> 8029 bytes .../skins/office2013/icons_hidpi.png | Bin 0 -> 18330 bytes .../skins/office2013/images/arrow.png | Bin 0 -> 261 bytes .../skins/office2013/images/close.png | Bin 0 -> 176 bytes .../skins/office2013/images/hidpi/close.png | Bin 0 -> 243 bytes .../office2013/images/hidpi/lock-open.png | Bin 0 -> 1503 bytes .../skins/office2013/images/hidpi/lock.png | Bin 0 -> 1616 bytes .../skins/office2013/images/hidpi/refresh.png | Bin 0 -> 2320 bytes .../skins/office2013/images/lock-open.png | Bin 0 -> 736 bytes .../skins/office2013/images/lock.png | Bin 0 -> 728 bytes .../skins/office2013/images/refresh.png | Bin 0 -> 953 bytes plugin/editor/ckeditor4/styles.js | 137 ++ plugin/editor/ckeditor4/upload.php | 82 + 200 files changed, 16174 insertions(+), 1 deletion(-) create mode 100644 plugin/editor/ckeditor4/CHANGES.md create mode 100644 plugin/editor/ckeditor4/LICENSE.md create mode 100644 plugin/editor/ckeditor4/README.md create mode 100644 plugin/editor/ckeditor4/adapters/jquery.js create mode 100644 plugin/editor/ckeditor4/build-config.js create mode 100644 plugin/editor/ckeditor4/ckeditor.js create mode 100644 plugin/editor/ckeditor4/config.js create mode 100644 plugin/editor/ckeditor4/contents.css create mode 100644 plugin/editor/ckeditor4/darkmode.css create mode 100644 plugin/editor/ckeditor4/editor.lib.php create mode 100644 plugin/editor/ckeditor4/lang/en.js create mode 100644 plugin/editor/ckeditor4/lang/ja.js create mode 100644 plugin/editor/ckeditor4/lang/ko.js create mode 100644 plugin/editor/ckeditor4/lang/zh-cn.js create mode 100644 plugin/editor/ckeditor4/plugins/about/dialogs/about.js create mode 100644 plugin/editor/ckeditor4/plugins/about/dialogs/hidpi/logo_ckeditor.png create mode 100644 plugin/editor/ckeditor4/plugins/about/dialogs/logo_ckeditor.png create mode 100644 plugin/editor/ckeditor4/plugins/clipboard/dialogs/paste.js create mode 100644 plugin/editor/ckeditor4/plugins/dialog/dialogDefinition.js create mode 100644 plugin/editor/ckeditor4/plugins/icons.png create mode 100644 plugin/editor/ckeditor4/plugins/icons_hidpi.png create mode 100644 plugin/editor/ckeditor4/plugins/image/dialogs/image.js create mode 100644 plugin/editor/ckeditor4/plugins/image/images/noimage.png create mode 100644 plugin/editor/ckeditor4/plugins/link/dialogs/anchor.js create mode 100644 plugin/editor/ckeditor4/plugins/link/dialogs/link.js create mode 100644 plugin/editor/ckeditor4/plugins/link/images/anchor.png create mode 100644 plugin/editor/ckeditor4/plugins/link/images/hidpi/anchor.png create mode 100644 plugin/editor/ckeditor4/plugins/magicline/images/hidpi/icon-rtl.png create mode 100644 plugin/editor/ckeditor4/plugins/magicline/images/hidpi/icon.png create mode 100644 plugin/editor/ckeditor4/plugins/magicline/images/icon-rtl.png create mode 100644 plugin/editor/ckeditor4/plugins/magicline/images/icon.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_address.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_blockquote.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_div.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h1.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h2.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h3.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h4.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h5.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h6.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_p.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_pre.png create mode 100644 plugin/editor/ckeditor4/plugins/table/dialogs/table.js create mode 100644 plugin/editor/ckeditor4/plugins/tableselection/styles/tableselection.css create mode 100644 plugin/editor/ckeditor4/plugins/tabletools/dialogs/tableCell.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadimage/plugin.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/dev/cors.html create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/dev/filereaderplugin.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/dev/upload.html create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/az.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/bg.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/ca.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/cs.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/da.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/de-ch.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/de.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/el.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/en-au.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/en.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/eo.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/es-mx.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/es.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/et.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/eu.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/fa.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/fr.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/gl.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/hr.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/hu.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/id.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/it.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/ja.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/km.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/ko.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/ku.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/lv.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/nb.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/nl.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/no.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/oc.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/pl.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/pt-br.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/pt.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/ro.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/ru.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/sk.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/sq.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/sv.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/tr.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/ug.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/uk.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/zh-cn.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/lang/zh.js create mode 100644 plugin/editor/ckeditor4/plugins/uploadwidget/plugin.js create mode 100644 plugin/editor/ckeditor4/plugins/widget/images/handle.png create mode 100644 plugin/editor/ckeditor4/samples/css/samples.css create mode 100644 plugin/editor/ckeditor4/samples/img/github-top.png create mode 100644 plugin/editor/ckeditor4/samples/img/header-bg.png create mode 100644 plugin/editor/ckeditor4/samples/img/header-separator.png create mode 100644 plugin/editor/ckeditor4/samples/img/logo.png create mode 100644 plugin/editor/ckeditor4/samples/img/logo.svg create mode 100644 plugin/editor/ckeditor4/samples/img/navigation-tip.png create mode 100644 plugin/editor/ckeditor4/samples/index.html create mode 100644 plugin/editor/ckeditor4/samples/js/sample.js create mode 100644 plugin/editor/ckeditor4/samples/js/sf.js create mode 100644 plugin/editor/ckeditor4/samples/old/ajax.html create mode 100644 plugin/editor/ckeditor4/samples/old/api.html create mode 100644 plugin/editor/ckeditor4/samples/old/appendto.html create mode 100644 plugin/editor/ckeditor4/samples/old/assets/inlineall/logo.png create mode 100644 plugin/editor/ckeditor4/samples/old/assets/outputxhtml/outputxhtml.css create mode 100644 plugin/editor/ckeditor4/samples/old/assets/posteddata.php create mode 100644 plugin/editor/ckeditor4/samples/old/assets/sample.jpg create mode 100644 plugin/editor/ckeditor4/samples/old/assets/uilanguages/languages.js create mode 100644 plugin/editor/ckeditor4/samples/old/datafiltering.html create mode 100644 plugin/editor/ckeditor4/samples/old/dialog/assets/my_dialog.js create mode 100644 plugin/editor/ckeditor4/samples/old/dialog/dialog.html create mode 100644 plugin/editor/ckeditor4/samples/old/divreplace.html create mode 100644 plugin/editor/ckeditor4/samples/old/enterkey/enterkey.html create mode 100644 plugin/editor/ckeditor4/samples/old/htmlwriter/assets/outputforflash/outputforflash.fla create mode 100644 plugin/editor/ckeditor4/samples/old/htmlwriter/assets/outputforflash/outputforflash.swf create mode 100644 plugin/editor/ckeditor4/samples/old/htmlwriter/assets/outputforflash/swfobject.js create mode 100644 plugin/editor/ckeditor4/samples/old/htmlwriter/outputforflash.html create mode 100644 plugin/editor/ckeditor4/samples/old/htmlwriter/outputhtml.html create mode 100644 plugin/editor/ckeditor4/samples/old/index.html create mode 100644 plugin/editor/ckeditor4/samples/old/inlineall.html create mode 100644 plugin/editor/ckeditor4/samples/old/inlinebycode.html create mode 100644 plugin/editor/ckeditor4/samples/old/inlinetextarea.html create mode 100644 plugin/editor/ckeditor4/samples/old/jquery.html create mode 100644 plugin/editor/ckeditor4/samples/old/magicline/magicline.html create mode 100644 plugin/editor/ckeditor4/samples/old/readonly.html create mode 100644 plugin/editor/ckeditor4/samples/old/replacebyclass.html create mode 100644 plugin/editor/ckeditor4/samples/old/replacebycode.html create mode 100644 plugin/editor/ckeditor4/samples/old/sample.css create mode 100644 plugin/editor/ckeditor4/samples/old/sample.js create mode 100644 plugin/editor/ckeditor4/samples/old/sample_posteddata.php create mode 100644 plugin/editor/ckeditor4/samples/old/tabindex.html create mode 100644 plugin/editor/ckeditor4/samples/old/toolbar/toolbar.html create mode 100644 plugin/editor/ckeditor4/samples/old/uicolor.html create mode 100644 plugin/editor/ckeditor4/samples/old/uilanguages.html create mode 100644 plugin/editor/ckeditor4/samples/old/wysiwygarea/fullpage.html create mode 100644 plugin/editor/ckeditor4/samples/old/xhtmlstyle.html create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/css/fontello.css create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/font/LICENSE.txt create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/font/config.json create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/font/fontello.eot create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/font/fontello.svg create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/font/fontello.ttf create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/font/fontello.woff create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/index.html create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/js/fulltoolbareditor.js create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/js/toolbarmodifier.js create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/js/toolbartextmodifier.js create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/lib/codemirror/LICENSE create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/lib/codemirror/codemirror.css create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/lib/codemirror/codemirror.js create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/lib/codemirror/javascript.js create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/lib/codemirror/neo.css create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/lib/codemirror/show-hint.css create mode 100644 plugin/editor/ckeditor4/samples/toolbarconfigurator/lib/codemirror/show-hint.js create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/dialog.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/dialog_ie.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/dialog_ie7.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/dialog_ie8.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/dialog_iequirks.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/editor.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/editor_gecko.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/editor_ie.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/editor_ie7.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/editor_ie8.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/editor_iequirks.css create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/icons.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/icons_hidpi.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/images/arrow.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/images/close.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/images/hidpi/close.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/images/hidpi/lock-open.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/images/hidpi/lock.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/images/hidpi/refresh.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/images/lock-open.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/images/lock.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/images/refresh.png create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/readme.md create mode 100644 plugin/editor/ckeditor4/skins/moono-dark/skin.js create mode 100644 plugin/editor/ckeditor4/skins/office2013/dialog.css create mode 100644 plugin/editor/ckeditor4/skins/office2013/editor.css create mode 100644 plugin/editor/ckeditor4/skins/office2013/icons.png create mode 100644 plugin/editor/ckeditor4/skins/office2013/icons_hidpi.png create mode 100644 plugin/editor/ckeditor4/skins/office2013/images/arrow.png create mode 100644 plugin/editor/ckeditor4/skins/office2013/images/close.png create mode 100644 plugin/editor/ckeditor4/skins/office2013/images/hidpi/close.png create mode 100644 plugin/editor/ckeditor4/skins/office2013/images/hidpi/lock-open.png create mode 100644 plugin/editor/ckeditor4/skins/office2013/images/hidpi/lock.png create mode 100644 plugin/editor/ckeditor4/skins/office2013/images/hidpi/refresh.png create mode 100644 plugin/editor/ckeditor4/skins/office2013/images/lock-open.png create mode 100644 plugin/editor/ckeditor4/skins/office2013/images/lock.png create mode 100644 plugin/editor/ckeditor4/skins/office2013/images/refresh.png create mode 100644 plugin/editor/ckeditor4/styles.js create mode 100644 plugin/editor/ckeditor4/upload.php diff --git a/.gitignore b/.gitignore index 03866fc5b..940c403cd 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ test.php log g5_tree cheditor5.*/ -ckeditor*/ +!ckeditor*/ log/ g5_tree/ .vscode/ diff --git a/plugin/editor/ckeditor4/CHANGES.md b/plugin/editor/ckeditor4/CHANGES.md new file mode 100644 index 000000000..aefff9dfe --- /dev/null +++ b/plugin/editor/ckeditor4/CHANGES.md @@ -0,0 +1,1637 @@ +CKEditor 4 Changelog +==================== + +## CKEditor 4.11.1 + +Fixed Issues: + +* [#2571](https://github.com/ckeditor/ckeditor-dev/issues/2571): Fixed: Clicking the categories in the [Emoji](https://ckeditor.com/cke4/addon/emoji) dropdown panel scrolls the entire page. + +## CKEditor 4.11 + +**Security Updates:** + +* Fixed XSS vulnerability in the HTML parser reported by [maxarr](https://hackerone.com/maxarr). + + Issue summary: It was possible to execute XSS inside CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, and (iii) switch back to WYSIWYG mode. + +**An upgrade is highly recommended!** + +New Features: + +* [#2062](https://github.com/ckeditor/ckeditor-dev/pull/2062): Added the emoji dropdown that allows the user to choose the emoji from the toolbar and search for them using keywords. +* [#2154](https://github.com/ckeditor/ckeditor-dev/issues/2154): The [Link](https://ckeditor.com/cke4/addon/link) plugin now supports phone number links. +* [#1815](https://github.com/ckeditor/ckeditor-dev/issues/1815): The [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin supports typing link completion. +* [#2478](https://github.com/ckeditor/ckeditor-dev/issues/2478): [Link](https://ckeditor.com/cke4/addon/link) can be inserted using the Ctrl/Cmd + K keystroke. +* [#651](https://github.com/ckeditor/ckeditor-dev/issues/651): Text pasted using the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin preserves indentation in paragraphs. +* [#2248](https://github.com/ckeditor/ckeditor-dev/issues/2248): Added support for justification in the [BBCode](https://ckeditor.com/cke4/addon/bbcode) plugin. Thanks to [Matěj Kmínek](https://github.com/KminekMatej)! +* [#706](https://github.com/ckeditor/ckeditor-dev/issues/706): Added a different cursor style when selecting cells for the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin. +* [#2072](https://github.com/ckeditor/ckeditor-dev/issues/2072): The [UI Button](https://ckeditor.com/cke4/addon/button) plugin supports custom `aria-haspopup` property values. The [Menu Button](https://ckeditor.com/cke4/addon/menubutton) `aria-haspopup` value is now `menu`, the [Panel Button](https://ckeditor.com/cke4/addon/panelbutton) and [Rich Combo](https://ckeditor.com/cke4/addon/richcombo) `aria-haspopup` value is now `listbox`. +* [#1176](https://github.com/ckeditor/ckeditor-dev/pull/1176): The [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) can now be attached to a selection instead of an element. +* [#2202](https://github.com/ckeditor/ckeditor-dev/issues/2202): Added the `contextmenu_contentsCss` configuration option to allow adding custom CSS to the [Context Menu](https://ckeditor.com/cke4/addon/contextmenu). + +Fixed Issues: + +* [#1477](https://github.com/ckeditor/ckeditor-dev/issues/1477): Fixed: On destroy, [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) does not destroy its content. +* [#2394](https://github.com/ckeditor/ckeditor-dev/issues/2394): Fixed: [Emoji](https://ckeditor.com/cke4/addon/emoji) dropdown does not show up with repeated symbols in a single line. +* [#1181](https://github.com/ckeditor/ckeditor-dev/issues/1181): [Chrome] Fixed: Opening the context menu in a read-only editor results in an error. +* [#2276](https://github.com/ckeditor/ckeditor-dev/issues/2276): [iOS] Fixed: [Button](https://ckeditor.com/cke4/addon/button) state does not refresh properly. +* [#1489](https://github.com/ckeditor/ckeditor-dev/issues/1489): Fixed: Table contents can be removed in read-only mode when the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin is used. +* [#1264](https://github.com/ckeditor/ckeditor-dev/issues/1264) Fixed: Right-click does not clear the selection created with the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin. +* [#586](https://github.com/ckeditor/ckeditor-dev/issues/586) Fixed: The `required` attribute is not correctly recognized by the [Form Elements](https://ckeditor.com/cke4/addon/forms) plugin dialog. Thanks to [Roli Züger](https://github.com/rzueger)! +* [#2380](https://github.com/ckeditor/ckeditor-dev/issues/2380) Fixed: Styling HTML comments in a top-level element results in extra paragraphs. +* [#2294](https://github.com/ckeditor/ckeditor-dev/issues/2294) Fixed: Pasting content from Microsoft Outlook and then bolding it results in an error. +* [#2035](https://github.com/ckeditor/ckeditor-dev/issues/2035) [Edge] Fixed: `Permission denied` is thrown when opening a [Panel](https://ckeditor.com/cke4/addon/panel) instance. +* [#965](https://github.com/ckeditor/ckeditor-dev/issues/965) Fixed: The [`config.forceSimpleAmpersand`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-forceSimpleAmpersand) option does not work. Thanks to [Alex Maris](https://github.com/alexmaris)! +* [#2448](https://github.com/ckeditor/ckeditor-dev/issues/2448): Fixed: The [`Escape HTML Entities`] plugin with custom [additional entities](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-entities_additional) configuration breaks HTML escaping. +* [#898](https://github.com/ckeditor/ckeditor-dev/issues/898): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) long alternative text protrudes into the editor when the image is selected. +* [#1113](https://github.com/ckeditor/ckeditor-dev/issues/1113): [Firefox] Fixed: Nested contenteditable elements path is not updated on focus with the [Div Editing Area](https://ckeditor.com/cke4/addon/divarea) plugin. +* [#1682](https://github.com/ckeditor/ckeditor-dev/issues/1682) Fixed: Hovering the [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) panel changes its size, causing flickering. +* [#421](https://github.com/ckeditor/ckeditor-dev/issues/421) Fixed: Expandable [Button](https://ckeditor.com/cke4/addon/button) puts the `(Selected)` text at the end of the label when clicked. +* [#1454](https://github.com/ckeditor/ckeditor-dev/issues/1454): Fixed: The [`onAbort`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-onAbort) method of the [Upload Widget](https://ckeditor.com/cke4/addon/uploadwidget) is not called when the loader is aborted. +* [#1451](https://github.com/ckeditor/ckeditor-dev/issues/1451): Fixed: The context menu is incorrectly positioned when opened with Shift+F10. +* [#1722](https://github.com/ckeditor/ckeditor-dev/issues/1722): [`CKEDITOR.filter.instances`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_filter.html#static-property-instances) is causing memory leaks. +* [#2491](https://github.com/ckeditor/ckeditor-dev/issues/2491): Fixed: The [Mentions](https://ckeditor.com/cke4/addon/mentions) plugin is not matching diacritic characters. +* [#2519](https://github.com/ckeditor/ckeditor-dev/issues/2519): Fixed: The [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) dialog should display all available keystrokes for a single command. + +API Changes: + +* [#2453](https://github.com/ckeditor/ckeditor-dev/issues/2453): The [`CKEDITOR.ui.panel.block.getItems`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_panel_block.html#method-getItems) method now also returns `input` elements in addition to links. +* [#2224](https://github.com/ckeditor/ckeditor-dev/issues/2224): The [`CKEDITOR.tools.convertToPx`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-convertToPx) function now converts negative values. +* [#2253](https://github.com/ckeditor/ckeditor-dev/issues/2253): The widget definition [`insert`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-insert) method now passes `editor` and `commandData`. Thanks to [marcparmet](https://github.com/marcparmet)! +* [#2045](https://github.com/ckeditor/ckeditor-dev/issues/2045): Extracted [`tools.eventsBuffer`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-eventsBuffer) and [`tools.throttle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-throttle) functions logic into a separate namespace. + * [`tools.eventsBuffer`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-eventsBuffer) was extracted into [`tools.buffers.event`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_buffers_event.html), + * [`tools.throttle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-throttle) was extracted into [`tools.buffers.throttle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_buffers_throttle.html). +* [#2466](https://github.com/ckeditor/ckeditor-dev/issues/2466): The [`CKEDITOR.filter`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-constructor) constructor accepts an additional `rules` parameter allowing to bind the editor and filter together. +* [#2493](https://github.com/ckeditor/ckeditor-dev/issues/2493): The [`editor.getCommandKeystroke`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getCommandKeystroke) method accepts an additional `all` parameter allowing to retrieve an array of all command keystrokes. +* [#2483](https://github.com/ckeditor/ckeditor-dev/issues/2483): Button's DOM element created with the [`hasArrow`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui.html#method-addButton) definition option can by identified by the `.cke_button_expandable` CSS class. + +Other Changes: + +* [#1713](https://github.com/ckeditor/ckeditor-dev/issues/1713): Removed the redundant `lang.title` entry from the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin. + +## CKEditor 4.10.1 + +Fixed Issues: + +* [#2114](https://github.com/ckeditor/ckeditor-dev/issues/2114): Fixed: [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) cannot be initialized before [`instanceReady`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-instanceReady). +* [#2107](https://github.com/ckeditor/ckeditor-dev/issues/2107): Fixed: Holding and releasing the mouse button is not inserting an [autocomplete](https://ckeditor.com/cke4/addon/autocomplete) suggestion. +* [#2167](https://github.com/ckeditor/ckeditor-dev/issues/2167): Fixed: Matching in [Emoji](https://ckeditor.com/cke4/addon/emoji) plugin is not case insensitive. +* [#2195](https://github.com/ckeditor/ckeditor-dev/issues/2195): Fixed: [Emoji](https://ckeditor.com/cke4/addon/emoji) shows the suggestion box when the colon is preceded with other characters than white space. +* [#2169](https://github.com/ckeditor/ckeditor-dev/issues/2169): [Edge] Fixed: Error thrown when pasting into the editor. +* [#1084](https://github.com/ckeditor/ckeditor-dev/issues/1084) Fixed: Using the "Automatic" option with [Color Button](https://ckeditor.com/cke4/addon/colorbutton) on a text with the color already defined sets an invalid color value. +* [#2271](https://github.com/ckeditor/ckeditor-dev/issues/2271): Fixed: Custom color name not used as a label in the [Color Button](https://ckeditor.com/cke4/addon/image2) plugin. Thanks to [Eric Geloen](https://github.com/egeloen)! +* [#2296](https://github.com/ckeditor/ckeditor-dev/issues/2296): Fixed: The [Color Button](https://ckeditor.com/cke4/addon/colorbutton) plugin throws an error when activated on content containing HTML comments. +* [#966](https://github.com/ckeditor/ckeditor-dev/issues/966): Fixed: Executing [`editor.destroy()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-destroy) during the [file upload](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-onUploading) throws an error. Thanks to [Maksim Makarevich](https://github.com/MaksimMakarevich)! +* [#1719](https://github.com/ckeditor/ckeditor-dev/issues/1719): Fixed: Ctrl/Cmd + A inadvertently focuses inline editor if it is starting and ending with a list. Thanks to [theNailz](https://github.com/theNailz)! +* [#1046](https://github.com/ckeditor/ckeditor-dev/issues/1046): Fixed: Subsequent new links do not include the `id` attribute. Thanks to [Nathan Samson](https://github.com/nathansamson)! +* [#1348](https://github.com/ckeditor/ckeditor-dev/issues/1348): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugin aspect ratio locking uses an old width and height on image URL change. +* [#1791](https://github.com/ckeditor/ckeditor-dev/issues/1791): Fixed: [Image](https://ckeditor.com/cke4/addon/image) and [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugins can be enabled when [Easy Image](https://ckeditor.com/cke4/addon/easyimage) is present. +* [#2254](https://github.com/ckeditor/ckeditor-dev/issues/2254): Fixed: [Image](https://ckeditor.com/cke4/addon/image) ratio locking is too precise for resized images. Thanks to [Jonathan Gilbert](https://github.com/logiclrd)! +* [#1184](https://github.com/ckeditor/ckeditor-dev/issues/1184): [IE8-11] Fixed: Copying and pasting data in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-readOnly) throws an error. +* [#1916](https://github.com/ckeditor/ckeditor-dev/issues/1916): [IE9-11] Fixed: Pressing the Delete key in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-readOnly) throws an error. +* [#2003](https://github.com/ckeditor/ckeditor-dev/issues/2003): [Firefox] Fixed: Right-clicking multiple selected table cells containing empty paragraphs removes the selection. +* [#1816](https://github.com/ckeditor/ckeditor-dev/issues/1816): Fixed: Table breaks when Enter is pressed over the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin. +* [#1115](https://github.com/ckeditor/ckeditor-dev/issues/1115): Fixed: The `` tag is not preserved when proper configuration is provided and a style is applied by the [Font](https://ckeditor.com/cke4/addon/font) plugin. +* [#727](https://github.com/ckeditor/ckeditor-dev/issues/727): Fixed: Custom styles may be invisible in the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin. +* [#988](https://github.com/ckeditor/ckeditor-dev/issues/988): Fixed: ACF-enabled custom elements prefixed with `object`, `embed`, `param` are removed from the editor content. + +API Changes: + +* [#2249](https://github.com/ckeditor/ckeditor-dev/issues/1791): Added the [`editor.plugins.detectConflict()`](https://ckeditor.com/docs/ckeditor4/latest/CKEDITOR_editor_plugins.html#method-detectConflict) method finding conflicts between provided plugins. + +## CKEditor 4.10 + +New Features: + +* [#1751](https://github.com/ckeditor/ckeditor-dev/issues/1751): Introduced the **Autocomplete** feature that consists of the following plugins: + * [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) – Provides contextual completion feature for custom text matches based on user input. + * [Text Watcher](https://ckeditor.com/cke4/addon/textWatcher) – Checks whether an editor's text change matches the chosen criteria. + * [Text Match](https://ckeditor.com/cke4/addon/textMatch) – Allows to search [`CKEDITOR.dom.range`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html) for matching text. +* [#1703](https://github.com/ckeditor/ckeditor-dev/issues/1703): Introduced the [Mentions](https://ckeditor.com/cke4/addon/mentions) plugin providing smart completion feature for custom text matches based on user input starting with a chosen marker character. +* [#1746](https://github.com/ckeditor/ckeditor-dev/issues/1703): Introduced the [Emoji](https://ckeditor.com/cke4/addon/emoji) plugin providing completion feature for emoji ideograms. +* [#1761](https://github.com/ckeditor/ckeditor-dev/issues/1761): The [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin now supports email links. + +Fixed Issues: + +* [#1458](https://github.com/ckeditor/ckeditor-dev/issues/1458): [Edge] Fixed: After blurring the editor it takes 2 clicks to focus a widget. +* [#1034](https://github.com/ckeditor/ckeditor-dev/issues/1034): Fixed: JAWS leaves forms mode after pressing the Enter key in an inline editor instance. +* [#1748](https://github.com/ckeditor/ckeditor-dev/pull/1748): Fixed: Missing [`CKEDITOR.dialog.definition.onHide`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_definition.html#property-onHide) API documentation. Thanks to [sunnyone](https://github.com/sunnyone)! +* [#1321](https://github.com/ckeditor/ckeditor-dev/issues/1321): Fixed: Ideographic space character (`\u3000`) is lost when pasting text. +* [#1776](https://github.com/ckeditor/ckeditor-dev/issues/1776): Fixed: Empty caption placeholder of the [Image Base](https://ckeditor.com/cke4/addon/imagebase) plugin is not hidden when blurred. +* [#1592](https://github.com/ckeditor/ckeditor-dev/issues/1592): Fixed: The [Image Base](https://ckeditor.com/cke4/addon/imagebase) plugin caption is not visible after paste. +* [#620](https://github.com/ckeditor/ckeditor-dev/issues/620): Fixed: The [`config.forcePasteAsPlainText`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-forcePasteAsPlainText) option is not respected in internal and cross-editor pasting. +* [#1467](https://github.com/ckeditor/ckeditor-dev/issues/1467): Fixed: The resizing cursor of the [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin appearing in the middle of a merged cell. + +API Changes: + +* [#850](https://github.com/ckeditor/ckeditor-dev/issues/850): Backward incompatibility: Replaced the `replace` dialog from the [Find / Replace](https://ckeditor.com/cke4/addon/find) plugin with a `tabId` option in the `find` command. +* [#1582](https://github.com/ckeditor/ckeditor-dev/issues/1582): The [`CKEDITOR.editor.addCommand()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-addCommand) method can now accept a [`CKEDITOR.command`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_command.html) instance as a parameter. +* [#1712](https://github.com/ckeditor/ckeditor-dev/issues/1712): The [`extraPlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-extraPlugins), [`removePlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-removePlugins) and [`plugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-plugins) configuration options allow whitespace. +* [#1802](https://github.com/ckeditor/ckeditor-dev/issues/1802): The [`extraPlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-extraPlugins), [`removePlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-removePlugins) and [`plugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-plugins) configuration options allow passing plugin names as an array. +* [#1724](https://github.com/ckeditor/ckeditor-dev/issues/1724): Added an option to the [`getClientRect()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_element.html#method-getClientRect) function allowing to retrieve an absolute bounding rectangle of the element, i.e. a position relative to the upper-left corner of the topmost viewport. +* [#1498](https://github.com/ckeditor/ckeditor-dev/issues/1498) : Added a new [`getClientRects()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-getClientRects) method to `CKEDITOR.dom.range`. It returns a list of rectangles for each selected element. +* [#1993](https://github.com/ckeditor/ckeditor-dev/issues/1993): Added the [`CKEDITOR.tools.throttle()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-throttle) function. + +Other Changes: + +* Updated [SCAYT](https://ckeditor.com/cke4/addon/scayt) (Spell Check As You Type) and [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugins: + * Language dictionary update: Added support for the Uzbek Latin language. + * Languages no longer supported as additional languages: Manx - Isle of Man (`gv_GB`) and Interlingua (`ia_XR`). + * Extended and improved language dictionaries: Georgian and Swedish. Also added the missing word _"Ensure"_ to the American, British and Canada English language. + * [#141](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/141) Fixed: SCAYT throws "Uncaught Error: Error in RangyWrappedRange module: createRange(): Parameter must be a Window object or DOM node". + * [#153](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/153) [Chrome] Fixed: Correcting a word in the widget in SCAYT moves focus to another editable. + * [#155](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/155) [IE8] Fixed: SCAYT throws an error and does not work. + * [#156](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/156) [IE10] Fixed: SCAYT does not seem to work. + * Fixed: After some text is dragged and dropped, the markup is not refreshed for grammar problems in SCAYT. + * Fixed: Request to FastCGI fails when the user tries to replace a word with non-English characters with a proper suggestion in WSC. + * [Firefox] Fixed: Ctrl+Z removes focus in SCAYT. + * Grammar support for default languages was improved. + * New application source URL was added in SCAYT. + * Removed green marks and legend related to grammar-supported languages in the Languages tab of SCAYT. Grammar is now supported for almost all the anguages in the list for an additional fee. + * Fixed: JavaScript error in the console: "Cannot read property 'split' of undefined" in SCAYT and WSC. + * [IE10] Fixed: Markup is not set for a specific case in SCAYT. + * Fixed: Accessibility issue: No `alt` attribute for the logo image in the About tab of SCAYT. + +## CKEditor 4.9.2 + +**Security Updates:** + +* Fixed XSS vulnerability in the [Enhanced Image](https://ckeditor.com/cke4/addon/image2) (`image2`) plugin reported by [Kyaw Min Thein](https://twitter.com/kyawminthein99). + + Issue summary: It was possible to execute XSS inside CKEditor using the `` tag and specially crafted HTML. Please note that the default presets (Basic/Standard/Full) do not include this plugin, so you are only at risk if you made a custom build and enabled this plugin. + +We would like to thank the [Drupal security team](https://www.drupal.org/drupal-security-team) for bringing this matter to our attention and coordinating the fix and release process! + +## CKEditor 4.9.1 + +Fixed Issues: + +* [#1835](https://github.com/ckeditor/ckeditor-dev/issues/1835): Fixed: Integration between [CKFinder](https://ckeditor.com/ckeditor-4/ckfinder/) and the [File Browser](https://ckeditor.com/cke4/addon/filebrowser) plugin does not work. + +## CKEditor 4.9 + +New Features: + +* [#932](https://github.com/ckeditor/ckeditor-dev/issues/932): Introduced Easy Image feature for inserting images that are automatically rescaled, optimized, responsive and delivered through a blazing-fast CDN. Three new plugins were added to support it: + * [Easy Image](https://ckeditor.com/cke4/addon/easyimage), + * [Cloud Services](https://ckeditor.com/cke4/addon/cloudservices) + * [Image Base](https://ckeditor.com/cke4/addon/imagebase) +* [#1338](https://github.com/ckeditor/ckeditor-dev/issues/1338): Keystroke labels are displayed for function keys (like F7, F8). +* [#643](https://github.com/ckeditor/ckeditor-dev/issues/643): The [File Browser](https://ckeditor.com/cke4/addon/filebrowser) plugin can now upload files using XHR requests. This allows for setting custom HTTP headers using the [`config.fileTools_requestHeaders`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-fileTools_requestHeaders) configuration option. +* [#1365](https://github.com/ckeditor/ckeditor-dev/issues/1365): The [File Browser](https://ckeditor.com/cke4/addon/filebrowser) plugin uses XHR requests by default. +* [#1399](https://github.com/ckeditor/ckeditor-dev/issues/1399): Added the possibility to set [`CKEDITOR.config.startupFocus`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-startupFocus) as `start` or `end` to specify where the editor focus should be after the initialization. +* [#1441](https://github.com/ckeditor/ckeditor-dev/issues/1441): The [Magic Line](https://ckeditor.com/cke4/addon/magicline) plugin line element can now be identified by the `data-cke-magic-line="1"` attribute. + +Fixed Issues: + +* [#595](https://github.com/ckeditor/ckeditor-dev/issues/595): Fixed: Pasting does not work on mobile devices. +* [#869](https://github.com/ckeditor/ckeditor-dev/issues/869): Fixed: Empty selection clears cached clipboard data in the editor. +* [#1419](https://github.com/ckeditor/ckeditor-dev/issues/1419): Fixed: The [Widget Selection](https://ckeditor.com/cke4/addon/widgetselection) plugin selects the editor content with the Alt+A key combination on Windows. +* [#1274](https://github.com/ckeditor/ckeditor-dev/issues/1274): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) does not match a single selected image using the [`contextDefinition.cssSelector`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_balloontoolbar_contextDefinition.html#property-cssSelector) matcher. +* [#1232](https://github.com/ckeditor/ckeditor-dev/issues/1232): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) buttons should be registered as focusable elements. +* [#1342](https://github.com/ckeditor/ckeditor-dev/issues/1342): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) should be re-positioned after the [`change`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-change) event. +* [#1426](https://github.com/ckeditor/ckeditor-dev/issues/1426): [IE8-9] Fixed: Missing [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) background in the [Kama](https://ckeditor.com/cke4/addon/kama) skin. Thanks to [Christian Elmer](https://github.com/keinkurt)! +* [#1470](https://github.com/ckeditor/ckeditor-dev/issues/1470): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) is not visible after drag and drop of a widget it is attached to. +* [#1048](https://github.com/ckeditor/ckeditor-dev/issues/1048): Fixed: [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) is not positioned properly when a margin is added to its non-static parent. +* [#889](https://github.com/ckeditor/ckeditor-dev/issues/889): Fixed: Unclear error message for width and height fields in the [Image](https://ckeditor.com/cke4/addon/image) and [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugins. +* [#859](https://github.com/ckeditor/ckeditor-dev/issues/859): Fixed: Cannot edit a link after a double-click on the text in the link. +* [#1013](https://github.com/ckeditor/ckeditor-dev/issues/1013): Fixed: [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) does not work correctly with the [`config.forcePasteAsPlainText`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-forcePasteAsPlainText) option. +* [#1356](https://github.com/ckeditor/ckeditor-dev/issues/1356): Fixed: [Border parse function](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_style_parse.html#method-border) does not allow spaces in the color value. +* [#1010](https://github.com/ckeditor/ckeditor-dev/issues/1010): Fixed: The CSS `border` shorthand property was incorrectly expanded ignoring the `border-color` style. +* [#1535](https://github.com/ckeditor/ckeditor-dev/issues/1535): Fixed: [Widget](https://ckeditor.com/cke4/addon/widget) mouseover border contrast is insufficient. +* [#1516](https://github.com/ckeditor/ckeditor-dev/issues/1516): Fixed: Fake selection allows removing content in read-only mode using the Backspace and Delete keys. +* [#1570](https://github.com/ckeditor/ckeditor-dev/issues/1570): Fixed: Fake selection allows cutting content in read-only mode using the Ctrl/Cmd + X keys. +* [#1363](https://github.com/ckeditor/ckeditor-dev/issues/1363): Fixed: Paste notification is unclear and it might confuse users. + +API Changes: + +* [#1346](https://github.com/ckeditor/ckeditor-dev/issues/1346): [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) [context manager API](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.plugins.balloontoolbar.contextManager.html) is now available in the [`pluginDefinition.init()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_pluginDefinition.html#method-init) method of the [requiring](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_pluginDefinition.html#property-requires) plugin. +* [#1530](https://github.com/ckeditor/ckeditor-dev/issues/1530): Added the possibility to use custom icons for [buttons](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_button.html.html). + +Other Changes: + +* Updated [SCAYT](https://ckeditor.com/cke4/addon/scayt) (Spell Check As You Type) and [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugins: + * SCAYT [`scayt_minWordLength`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#scayt_minWordLength) configuration option now defaults to 3 instead of 4. + * SCAYT default number of suggested words in the context menu changed to 3. + * [#90](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/90): Fixed: Selection is lost on link creation if SCAYT highlights the word. + * Fixed: SCAYT crashes when the browser `localStorage` is disabled. + * [IE11] Fixed: `Unable to get property type of undefined or null reference` error in the browser console when SCAYT is disabled/enabled. + * [#46](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/46): Fixed: Editing is blocked when remote spell checker server is offline. + * Fixed: User Dictionary cannot be created in WSC due to `You already have the dictionary` error. + * Fixed: Words with apostrophe `'` on the replacement make the WSC dialog inaccessible. + * Fixed: SCAYT/WSC causes the `Uncaught TypeError` error in the browser console. +* [#1337](https://github.com/ckeditor/ckeditor-dev/issues/1337): Updated the samples layout with the new CKEditor 4 logo and color scheme. +* [#1591](https://github.com/ckeditor/ckeditor-dev/issues/1591): CKBuilder and language tools are now downloaded over HTTPS. Thanks to [August Detlefsen](https://github.com/augustd)! + +## CKEditor 4.8 + +**Important Notes:** + +* [#1249](https://github.com/ckeditor/ckeditor-dev/issues/1249): Enabled the [Upload Image](https://ckeditor.com/cke4/addon/uploadimage) plugin by default in standard and full presets. Also, it will no longer log an error in case of missing [`config.imageUploadUrl`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-imageUploadUrl) property. + +New Features: + +* [#933](https://github.com/ckeditor/ckeditor-dev/issues/933): Introduced [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) plugin. +* [#662](https://github.com/ckeditor/ckeditor-dev/issues/662): Introduced image inlining for the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#468](https://github.com/ckeditor/ckeditor-dev/issues/468): [Edge] Introduced support for the Clipboard API. +* [#607](https://github.com/ckeditor/ckeditor-dev/issues/607): Manually inserted Hex color is prefixed with a hash character (`#`) if needed. It ensures a valid Hex color value is used when setting the table cell border or background color with the [Color Dialog](https://ckeditor.com/cke4/addon/colordialog) window. +* [#584](https://github.com/ckeditor/ckeditor-dev/issues/584): [Font size and Family](https://ckeditor.com/cke4/addon/font) and [Format](https://ckeditor.com/cke4/addon/format) drop-downs are not toggleable anymore. Default option to reset styles added. +* [#856](https://github.com/ckeditor/ckeditor-dev/issues/856): Introduced the [`CKEDITOR.tools.keystrokeToArray()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-keystrokeToArray) method. It converts a keystroke into its string representation, returning every key name as a separate array element. +* [#1053](https://github.com/ckeditor/ckeditor-dev/issues/1053): Introduced the [`CKEDITOR.tools.object.merge()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_object.html#method-merge) method. It allows to merge two objects, returning the new object with all properties from both objects deeply cloned. +* [#1073](https://github.com/ckeditor/ckeditor-dev/issues/1073): Introduced the [`CKEDITOR.tools.array.every()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_array.html#method-every) method. It invokes a given test function on every array element and returns `true` if all elements pass the test. + +Fixed Issues: + +* [#796](https://github.com/ckeditor/ckeditor-dev/issues/796): Fixed: A list is pasted from OneNote in the reversed order. +* [#834](https://github.com/ckeditor/ckeditor-dev/issues/834): [IE9-11] Fixed: The editor does not save the selected state of radio buttons inserted by the [Form Elements](https://ckeditor.com/cke4/addon/forms) plugin. +* [#704](https://github.com/ckeditor/ckeditor-dev/issues/704): [Edge] Fixed: Using Ctrl/Cmd + Z breaks widget structure. +* [#591](https://github.com/ckeditor/ckeditor-dev/issues/591): Fixed: A column is inserted in a wrong order inside the table if any cell has a vertical split. +* [#787](https://github.com/ckeditor/ckeditor-dev/issues/787): Fixed: Using Cut inside a nested table does not cut the selected content. +* [#842](https://github.com/ckeditor/ckeditor-dev/issues/842): Fixed: List style not restored when toggling list indent level in the [Indent List](https://ckeditor.com/cke4/addon/indentlist) plugin. +* [#711](https://github.com/ckeditor/ckeditor-dev/issues/711): Fixed: Dragging widgets should only work with the left mouse button. +* [#862](https://github.com/ckeditor/ckeditor-dev/issues/862): Fixed: The "Object Styles" group in the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin is visible only if the whole element is selected. +* [#994](https://github.com/ckeditor/ckeditor-dev/pull/994): Fixed: Typo in the [`CKEDITOR.focusManager.focus()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_focusManager.html#method-focus) API documentation. Thanks to [benjy](https://github.com/benjy)! +* [#1014](https://github.com/ckeditor/ckeditor-dev/issues/1014): Fixed: The [Table Tools](https://ckeditor.com/cke4/addon/tabletools) Cell Properties dialog is now [Advanced Content Filter](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_acf.html) aware — it is not possible to change the cell width or height if corresponding styles are disabled. +* [#877](https://github.com/ckeditor/ckeditor-dev/issues/877): Fixed: A list with custom bullets with exotic characters crashes the editor when [pasted from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#605](https://github.com/ckeditor/ckeditor-dev/issues/605): Fixed: Inline widgets do not preserve trailing spaces. +* [#1008](https://github.com/ckeditor/ckeditor-dev/issues/1008): Fixed: Shorthand Hex colors from the [`config.colorButton_colors`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_colors) option are not correctly highlighted in the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) Text Color or Background Color panel. +* [#1094](https://github.com/ckeditor/ckeditor-dev/issues/1094): Fixed: Widget definition [`upcast`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-upcasts) methods are called for every element. +* [#1057](https://github.com/ckeditor/ckeditor-dev/issues/1057): Fixed: The [Notification](https://ckeditor.com/addon/notification) plugin overwrites Web Notifications API due to leakage to the global scope. +* [#1068](https://github.com/ckeditor/ckeditor-dev/issues/1068): Fixed: Upload widget paste listener ignores changes to the [`uploadWidgetDefinition`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.fileTools.uploadWidgetDefinition.html). +* [#921](https://github.com/ckeditor/ckeditor-dev/issues/921): Fixed: [Edge] CKEditor erroneously perceives internal copy and paste as type "external". +* [#1213](https://github.com/ckeditor/ckeditor-dev/issues/1213): Fixed: Multiple images uploaded using [Upload Image](https://ckeditor.com/cke4/addon/uploadimage) plugin are randomly duplicated or mangled. +* [#532](https://github.com/ckeditor/ckeditor-dev/issues/532): Fixed: Removed an outdated user guide link from the [About](https://ckeditor.com/cke4/addon/about) dialog. +* [#1221](https://github.com/ckeditor/ckeditor-dev/issues/1221): Fixed: Invalid CSS loaded by [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) plugin when [`config.skin`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-skin) is loaded using a custom path. +* [#522](https://github.com/ckeditor/ckeditor-dev/issues/522): Fixed: Widget selection is not removed when widget is inside table cell with [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin enabled. +* [#1027](https://github.com/ckeditor/ckeditor-dev/issues/1027): Fixed: Cannot add multiple images to the table with [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin in certain situations. +* [#1069](https://github.com/ckeditor/ckeditor-dev/issues/1069): Fixed: Wrong shape processing by [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#995](https://github.com/ckeditor/ckeditor-dev/issues/995): Fixed: Hyperlinked image gets inserted twice by [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#1287](https://github.com/ckeditor/ckeditor-dev/issues/1287): Fixed: [Widget](https://ckeditor.com/cke4/addon/widget) plugin throws exception if included in editor build but not loaded into editor's instance. + +API Changes: + +* [#1097](https://github.com/ckeditor/ckeditor-dev/issues/1097): Widget [`upcast`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-upcast) methods are now called in the [widget definition's](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#property-definition) context. +* [#1118](https://github.com/ckeditor/ckeditor-dev/issues/1118): Added the `show` option in the [`balloonPanel.attach()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_balloonPanel.html#method-attach) method, allowing to attach a hidden [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) instance. +* [#1145](https://github.com/ckeditor/ckeditor-dev/issues/1145): Added the [`skipNotifications`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-skipNotifications) option to the [`CKEDITOR.fileTools.uploadWidgetDefinition`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.fileTools.uploadWidgetDefinition.html), allowing to switch off default notifications displayed by upload widgets. + +Other Changes: + +* [#815](https://github.com/ckeditor/ckeditor-dev/issues/815): Removed Node.js dependency from the CKEditor build script. +* [#1041](https://github.com/ckeditor/ckeditor-dev/pull/1041), [#1131](https://github.com/ckeditor/ckeditor-dev/issues/1131): Updated URLs pointing to [CKSource](https://cksource.com/) and [CKEditor](https://ckeditor.com/) resources after the launch of new websites. + +## CKEditor 4.7.3 + +New Features: + +* [#568](https://github.com/ckeditor/ckeditor-dev/issues/568): Added possibility to adjust nested editables' filters using the [`CKEDITOR.filter.disallowedContent`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_filter.html#property-disallowedContent) property. + +Fixed Issues: + +* [#554](https://github.com/ckeditor/ckeditor-dev/issues/554): Fixed: [`change`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-change) event not fired when typing the first character after pasting into the editor. Thanks to [Daniel Miller](https://github.com/millerdev)! +* [#566](https://github.com/ckeditor/ckeditor-dev/issues/566): Fixed: The CSS `border` shorthand property with zero width (`border: 0px solid #000;`) causes the table to have the border attribute set to 1. +* [#779](https://github.com/ckeditor/ckeditor-dev/issues/779): Fixed: The [Remove Format](https://ckeditor.com/cke4/addon/removeformat) plugin removes elements with language definition inserted by the [Language](https://ckeditor.com/cke4/addon/language) plugin. +* [#423](https://github.com/ckeditor/ckeditor-dev/issues/423): Fixed: The [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin pastes paragraphs into the editor even if [`CKEDITOR.config.enterMode`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-enterMode) is set to `CKEDITOR.ENTER_BR`. +* [#719](https://github.com/ckeditor/ckeditor-dev/issues/719): Fixed: Image inserted using the [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugin can be resized when the editor is in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html). +* [#577](https://github.com/ckeditor/ckeditor-dev/issues/577): Fixed: The "Delete Columns" command provided by the [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin throws an error when trying to delete columns. +* [#867](https://github.com/ckeditor/ckeditor-dev/issues/867): Fixed: Typing into a selected table throws an error. +* [#817](https://github.com/ckeditor/ckeditor-dev/issues/817): Fixed: The [Save](https://ckeditor.com/cke4/addon/save) plugin does not work in [Source Mode](https://ckeditor.com/cke4/addon/sourcearea). + +Other Changes: + +* Updated the [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) plugin: + * [#40](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/40): Fixed: IE10 throws an error when spell checking is started. +* [#800](https://github.com/ckeditor/ckeditor-dev/issues/800): Added the [`CKEDITOR.dom.selection.isCollapsed()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_selection.html#method-isCollapsed) method which is a simpler way to check if the selection is collapsed. +* [#830](https://github.com/ckeditor/ckeditor-dev/issues/830): Added an option to define which dialog tab should be shown by default when creating [`CKEDITOR.dialogCommand`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.dialogCommand.html). + +## CKEditor 4.7.2 + +New Features: + +* [#455](https://github.com/ckeditor/ckeditor-dev/issues/455): Added [Advanced Content Filter](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_acf.html) integration with the [Justify](https://ckeditor.com/cke4/addon/justify) plugin. + +Fixed Issues: + +* [#663](https://github.com/ckeditor/ckeditor-dev/issues/663): [Chrome] Fixed: Clicking the scrollbar throws an `Uncaught TypeError: element.is is not a function` error. +* [#694](https://github.com/ckeditor/ckeditor-dev/pull/694): Refactoring in the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin: + * [#520](https://github.com/ckeditor/ckeditor-dev/issues/520): Fixed: Widgets cannot be properly pasted into a table cell. + * [#460](https://github.com/ckeditor/ckeditor-dev/issues/460): Fixed: Editor gone after pasting into an editor within a table. +* [#579](https://github.com/ckeditor/ckeditor-dev/issues/579): Fixed: Internal `cke_table-faked-selection-table` class is visible in the Stylesheet Classes field of the [Table Properties](https://ckeditor.com/cke4/addon/table) dialog. +* [#545](https://github.com/ckeditor/ckeditor-dev/issues/545): [Edge] Fixed: Error thrown when pressing the [Select All](https://ckeditor.com/cke4/addon/selectall) button in [Source Mode](https://ckeditor.com/cke4/addon/sourcearea). +* [#582](https://github.com/ckeditor/ckeditor-dev/issues/582): Fixed: Double slash in the path to stylesheet needed by the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin. Thanks to [Marius Dumitru Florea](https://github.com/mflorea)! +* [#491](https://github.com/ckeditor/ckeditor-dev/issues/491): Fixed: Unnecessary dependency on the [Editor Toolbar](https://ckeditor.com/cke4/addon/toolbar) plugin inside the [Notification](https://ckeditor.com/cke4/addon/notification) plugin. +* [#646](https://github.com/ckeditor/ckeditor-dev/issues/646): Fixed: Error thrown into the browser console after opening the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin menu in the editor without any selection. +* [#501](https://github.com/ckeditor/ckeditor-dev/issues/501): Fixed: Double click does not open the dialog for modifying anchors inserted via the [Link](https://ckeditor.com/cke4/addon/link) plugin. +* [#9780](https://dev.ckeditor.com/ticket/9780): [IE8-9] Fixed: Clicking inside an empty [read-only](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-readOnly) editor throws an error. +* [#16820](https://dev.ckeditor.com/ticket/16820): [IE10] Fixed: Clicking below a single horizontal rule throws an error. +* [#426](https://github.com/ckeditor/ckeditor-dev/issues/426): Fixed: The [`range.cloneContents()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-cloneContents) method selects the whole element when the selection starts at the beginning of that element. +* [#644](https://github.com/ckeditor/ckeditor-dev/issues/644): Fixed: The [`range.extractContents()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-extractContents) method returns an incorrect result when multiple nodes are selected. +* [#684](https://github.com/ckeditor/ckeditor-dev/issues/684): Fixed: The [`elementPath.contains()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_elementPath.html#method-contains) method incorrectly excludes the last element instead of root when the `fromTop` parameter is set to `true`. + +Other Changes: + +* Updated the [SCAYT](https://ckeditor.com/cke4/addon/scayt) (Spell Check As You Type) plugin: + * [#148](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/148): Fixed: SCAYT leaves underlined word after the CKEditor Replace dialog corrects it. +* [#751](https://github.com/ckeditor/ckeditor-dev/issues/751): Added the [`CKEDITOR.dom.nodeList.toArray()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_nodeList.html#method-toArray) method which returns an array representation of a [node list](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.dom.nodeList.html). + +## CKEditor 4.7.1 + +New Features: + +* Added a new Mexican Spanish localization. Thanks to [David Alexandro Rodriguez](https://www.transifex.com/user/profile/darsco16/)! +* [#413](https://github.com/ckeditor/ckeditor-dev/issues/413): Added Paste as Plain Text keyboard shortcut to the [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) instructions. + +Fixed Issues: + +* [#515](https://github.com/ckeditor/ckeditor-dev/issues/515): [Chrome] Fixed: Mouse actions on CKEditor scrollbar throw an exception when the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin is loaded. +* [#493](https://github.com/ckeditor/ckeditor-dev/issues/493): Fixed: Selection started from a nested table causes an error in the browser while scrolling down. +* [#415](https://github.com/ckeditor/ckeditor-dev/issues/415): [Firefox] Fixed: Enter key breaks the table structure when pressed in a table selection. +* [#457](https://github.com/ckeditor/ckeditor-dev/issues/457): Fixed: Error thrown when deleting content from the editor with no selection. +* [#478](https://github.com/ckeditor/ckeditor-dev/issues/478): [Chrome] Fixed: Error thrown by the [Enter Key](https://ckeditor.com/cke4/addon/enterkey) plugin when pressing Enter with no selection. +* [#424](https://github.com/ckeditor/ckeditor-dev/issues/424): Fixed: Error thrown by [Tab Key Handling](https://ckeditor.com/cke4/addon/tab) and [Indent List](https://ckeditor.com/cke4/addon/indentlist) plugins when pressing Tab with no selection in inline editor. +* [#476](https://github.com/ckeditor/ckeditor-dev/issues/476): Fixed: Anchors inserted with the [Link](https://ckeditor.com/cke4/addon/link) plugin on collapsed selection cannot be edited. +* [#417](https://github.com/ckeditor/ckeditor-dev/issues/417): Fixed: The [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin throws an error when used with a table with only header or footer rows. +* [#523](https://github.com/ckeditor/ckeditor-dev/issues/523): Fixed: The [`editor.getCommandKeystroke()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getCommandKeystroke) method does not obtain the correct keystroke. +* [#534](https://github.com/ckeditor/ckeditor-dev/issues/534): [IE] Fixed: [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) does not work in Quirks Mode. +* [#450](https://github.com/ckeditor/ckeditor-dev/issues/450): Fixed: [`CKEDITOR.filter`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.filter.html) incorrectly transforms the `margin` CSS property. + +## CKEditor 4.7 + +**Important Notes:** + +* [#13793](https://dev.ckeditor.com/ticket/13793): The [`embed_provider`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-embed_provider) configuration option for the [Media Embed](https://ckeditor.com/cke4/addon/embed) and [Semantic Media Embed](https://ckeditor.com/cke4/addon/embedsemantic) plugins is no longer preset by default. +* The [UI Color](https://ckeditor.com/cke4/addon/uicolor) plugin now uses a custom color picker instead of the `YUI 2.7.0` library which has some known vulnerabilities (it's a security precaution, there was no security issue in CKEditor due to the way it was used). + +New Features: + +* [#16755](https://dev.ckeditor.com/ticket/16755): Added the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin that lets you select and manipulate an arbitrary rectangular table fragment (a few cells, a row or a column). +* [#16961](https://dev.ckeditor.com/ticket/16961): Added support for pasting from Microsoft Excel. +* [#13381](https://dev.ckeditor.com/ticket/13381): Dynamic code evaluation call in [`CKEDITOR.template`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.template.html) removed. CKEditor can now be used without the `unsafe-eval` Content Security Policy. Thanks to [Caridy Patiño](http://caridy.name)! +* [#16971](https://dev.ckeditor.com/ticket/16971): Added support for color in the `background` property containing also other styles for table cells in the [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin. +* [#16847](https://dev.ckeditor.com/ticket/16847): Added support for parsing and inlining any formatting created using the Microsoft Word style system to the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#16818](https://dev.ckeditor.com/ticket/16818): Added table cell height parsing in the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#16850](https://dev.ckeditor.com/ticket/16850): Added a new [`config.enableContextMenu`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-enableContextMenu) configuration option for enabling and disabling the [context menu](https://ckeditor.com/cke4/addon/contextmenu). +* [#16937](https://dev.ckeditor.com/ticket/16937): The `command` parameter in [`CKEDITOR.editor.getCommandKeystroke()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getCommandKeystroke) now also accepts a command name as an argument. +* [#17010](https://dev.ckeditor.com/ticket/17010): The [`CKEDITOR.dom.range.shrink()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-shrink) method now allows for skipping bogus `
    ` elements. + +Fixed Issues: + +* [#16935](https://dev.ckeditor.com/ticket/16935): [Chrome] Fixed: Blurring the editor in [Source Mode](https://ckeditor.com/cke4/addon/sourcearea) throws an error. +* [#16825](https://dev.ckeditor.com/ticket/16825): [Chrome] Fixed: Error thrown when destroying a focused inline editor. +* [#16857](https://dev.ckeditor.com/ticket/16857): Fixed: Ctrl+Shift+V blocked by [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting). +* [#16845](https://dev.ckeditor.com/ticket/16845): [IE] Fixed: Cursor jumps to the top of the scrolled editor after focusing it when the [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting) plugin is enabled. +* [#16786](https://dev.ckeditor.com/ticket/16786): Fixed: Added missing translations for the [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting) plugin. +* [#14714](https://dev.ckeditor.com/ticket/14714): [WebKit/Blink] Fixed: Exception thrown on refocusing a blurred inline editor. +* [#16913](https://dev.ckeditor.com/ticket/16913): [Firefox, IE] Fixed: [Paste as Plain Text](https://ckeditor.com/cke4/addon/pastetext) keystroke does not work. +* [#16968](https://dev.ckeditor.com/ticket/16968): Fixed: [Safari] [Paste as Plain Text](https://ckeditor.com/cke4/addon/pastetext) is not handled by the editor. +* [#16912](https://dev.ckeditor.com/ticket/16912): Fixed: Exception thrown when a single image is pasted using [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#16821](https://dev.ckeditor.com/ticket/16821): Fixed: Extraneous `` elements with `height` style stacked when [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#16866](https://dev.ckeditor.com/ticket/16866): [IE, Edge] Fixed: Whitespaces not preserved when [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#16860](https://dev.ckeditor.com/ticket/16860): Fixed: Paragraphs which only look like lists incorrectly transformed into them when [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#16817](https://dev.ckeditor.com/ticket/16817): Fixed: When [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword), paragraphs are transformed into lists with some corrupted data. +* [#16833](https://dev.ckeditor.com/ticket/16833): [IE11] Fixed: Malformed list with headers [pasted from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#16826](https://dev.ckeditor.com/ticket/16826): [IE] Fixed: Superfluous paragraphs within lists [pasted from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#12465](https://dev.ckeditor.com/ticket/12465): Fixed: Cannot change the state of checkboxes or radio buttons if the properties dialog was invoked with a double-click. +* [#13062](https://dev.ckeditor.com/ticket/13062): Fixed: Impossible to unlink when the caret is at the edge of the link. +* [#13585](https://dev.ckeditor.com/ticket/13585): Fixed: Error when wrapping two adjacent `
    ` elements with a `
    `. +* [#16811](https://dev.ckeditor.com/ticket/16811): Fixed: Table alignment is not preserved by the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#16810](https://dev.ckeditor.com/ticket/16810): Fixed: Vertical align in tables is not supported by the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#11956](https://dev.ckeditor.com/ticket/11956): [Blink, IE] Fixed: [Link](https://ckeditor.com/cke4/addon/link) dialog does not open on a double click on the second word of the link with a background color or other styles. +* [#10472](https://dev.ckeditor.com/ticket/10472): Fixed: Unable to use [Table Resize](https://ckeditor.com/cke4/addon/tableresize) on table header and footer. +* [#14762](https://dev.ckeditor.com/ticket/14762): Fixed: Hovering over an empty table (without rows or cells) throws an error when the [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin is active. +* [#16777](https://dev.ckeditor.com/ticket/16777): [Edge] Fixed: The [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin does not allow to drop widgets into the editor. +* [#14894](https://dev.ckeditor.com/ticket/14894): [Chrome] Fixed: The editor scrolls to the top after focusing or when a dialog is opened. +* [#14769](https://dev.ckeditor.com/ticket/14769): Fixed: URLs with '-' in host are not detected by the [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin. +* [#16804](https://dev.ckeditor.com/ticket/16804): Fixed: Focus is not on the first menu item when the user opens a context menu or a drop-down list from the editor toolbar. +* [#14407](https://dev.ckeditor.com/ticket/14407): [IE] Fixed: Non-editable widgets can be edited. +* [#16927](https://dev.ckeditor.com/ticket/16927): Fixed: An error thrown if a bundle containing the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) plugin is run in ES5 strict mode. Thanks to [Igor Rubinovich](https://github.com/IgorRubinovich)! +* [#16920](https://dev.ckeditor.com/ticket/16920): Fixed: Several plugins not using the [Dialog](https://ckeditor.com/cke4/addon/dialog) plugin as a direct dependency. +* [PR#336](https://github.com/ckeditor/ckeditor-dev/pull/336): Fixed: Typo in [`CKEDITOR.getCss()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-getCss) API documentation. Thanks to [knusperpixel](https://github.com/knusperpixel)! +* [#17027](https://dev.ckeditor.com/ticket/17027): Fixed: Command event data should be initialized as an empty object. +* Fixed the behavior of HTML parser when parsing `src`/`srcdoc` attributes of the `