diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index a4bf27e57..ea408a1ea 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -944,7 +944,7 @@ module ApplicationHelper
attachments += obj.attachments if obj.respond_to?(:attachments)
end
if attachments.present?
- text.gsub!(/src="([^\/"]+\.(bmp|gif|jpg|jpe|jpeg|png))"(\s+alt="([^"]*)")?/i) do |m|
+ text.gsub!(/src="([^\/"]+\.(bmp|gif|jpg|jpe|jpeg|png|webp))"(\s+alt="([^"]*)")?/i) do |m|
filename, ext, alt, alttext = $1, $2, $3, $4
# search for the picture in attachments
if found = Attachment.latest_attach(attachments, CGI.unescape(filename))
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index 980890643..86382054d 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -220,7 +220,7 @@ class Attachment < ActiveRecord::Base
end
def image?
- !!(self.filename =~ /\.(bmp|gif|jpg|jpe|jpeg|png)$/i)
+ !!(self.filename =~ /\.(bmp|gif|jpg|jpe|jpeg|png|webp)$/i)
end
def thumbnailable?
diff --git a/lib/redmine/mime_type.rb b/lib/redmine/mime_type.rb
index 65d15aa4b..679c9aa8d 100644
--- a/lib/redmine/mime_type.rb
+++ b/lib/redmine/mime_type.rb
@@ -44,6 +44,7 @@ module Redmine
'image/jpeg' => 'jpg,jpeg,jpe',
'image/png' => 'png',
'image/tiff' => 'tiff,tif',
+ 'image/webp' => 'webp',
'image/x-ms-bmp' => 'bmp',
'application/javascript' => 'js',
'application/pdf' => 'pdf',
diff --git a/lib/redmine/thumbnail.rb b/lib/redmine/thumbnail.rb
index 0b1333d1a..a777ed9e8 100644
--- a/lib/redmine/thumbnail.rb
+++ b/lib/redmine/thumbnail.rb
@@ -29,7 +29,7 @@ module Redmine
('gswin64c' if Redmine::Platform.mswin?) ||
'gs'
).freeze
- ALLOWED_TYPES = %w(image/bmp image/gif image/jpeg image/png application/pdf)
+ ALLOWED_TYPES = %w(image/bmp image/gif image/jpeg image/png image/webp application/pdf)
# Generates a thumbnail for the source image to target
def self.generate(source, target, size, is_pdf = false)
diff --git a/test/fixtures/attachments.yml b/test/fixtures/attachments.yml
index 3805df02e..088f04df6 100644
--- a/test/fixtures/attachments.yml
+++ b/test/fixtures/attachments.yml
@@ -309,3 +309,17 @@ attachments_023:
filename: ecookbook-gantt.pdf
author_id: 2
description: Gantt chart as of May 11
+attachments_024:
+ created_on: 2023-01-11 08:46:41 +00:00
+ content_type: image/webp
+ container_type: Issue
+ container_id: 1
+ downloads: 0
+ disk_filename: 230111173947_logo.webp
+ disk_directory: "2023/01"
+ digest: 9219249de57e601a0bb65845304bc44bb1961ea1c2b8ace28c38fa40c3c741e5
+ id: 24
+ filesize: 74974
+ filename: logo.webp
+ author_id: 2
+ description: WebP image
\ No newline at end of file
diff --git a/test/helpers/application_helper_test.rb b/test/helpers/application_helper_test.rb
index cf7c4ff3a..ff62525f2 100644
--- a/test/helpers/application_helper_test.rb
+++ b/test/helpers/application_helper_test.rb
@@ -184,6 +184,8 @@ class ApplicationHelperTest < Redmine::HelperTest
'Inline image:
',
'Inline image: !logo.GIF!' =>
'Inline image:
',
+ 'Inline WebP image: !logo.webp!' =>
+ 'Inline WebP image:
',
'No match: !ogo.gif!' => 'No match:
',
'No match: !ogo.GIF!' => 'No match:
',
# link image
diff --git a/test/unit/attachment_test.rb b/test/unit/attachment_test.rb
index d4ef2f7cd..891e6145a 100644
--- a/test/unit/attachment_test.rb
+++ b/test/unit/attachment_test.rb
@@ -520,6 +520,7 @@ class AttachmentTest < ActiveSupport::TestCase
def test_thumbnailable_should_be_true_for_images
skip unless convert_installed?
assert_equal true, Attachment.new(:filename => 'test.jpg').thumbnailable?
+ assert_equal true, Attachment.new(:filename => 'test.webp').thumbnailable?
end
def test_thumbnailable_should_be_false_for_images_if_convert_is_unavailable
diff --git a/test/unit/lib/redmine/mime_type_test.rb b/test/unit/lib/redmine/mime_type_test.rb
index cbf1d3dec..943fef03c 100644
--- a/test/unit/lib/redmine/mime_type_test.rb
+++ b/test/unit/lib/redmine/mime_type_test.rb
@@ -77,6 +77,12 @@ class Redmine::MimeTypeTest < ActiveSupport::TestCase
end
end
+ def test_by_type
+ image_types = Redmine::MimeType.by_type('image')
+ assert_includes image_types, 'image/png'
+ assert_includes image_types, 'image/webp'
+ end
+
def test_should_default_to_mime_type_gem
assert !Redmine::MimeType::EXTENSIONS.key?("zip")
assert_equal "application/zip", Redmine::MimeType.of("file.zip")