From c31772879bc9df51b71f75edc529bfed878d65d1 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Mon, 9 Jan 2023 12:16:02 +1000 Subject: [PATCH] FIX: Disable image optimization in iOS Safari (#19790) There are various performance issues with the Canvas in iOS Safari that are causing crashes when processing images with spikes of over 100% CPU usage. The cause of this is unknown, but profiling points to CanvasRenderingContext2D.getImageData() and CanvasRenderingContext2D.drawImage(). Until Safari makes some progress with OffscreenCanvas or other alternatives we cannot support this workflow. We will revisit in 6 months. This is gated behind the hidden `composer_ios_media_optimisation_image_enabled` site setting for people who really still want to try using this. --- ...ter-media-optimization-upload-processor.js | 21 ++++++++++++++++++- config/site_settings.yml | 4 ++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/initializers/register-media-optimization-upload-processor.js b/app/assets/javascripts/discourse/app/initializers/register-media-optimization-upload-processor.js index f80b68bde1..f7cd1f6132 100644 --- a/app/assets/javascripts/discourse/app/initializers/register-media-optimization-upload-processor.js +++ b/app/assets/javascripts/discourse/app/initializers/register-media-optimization-upload-processor.js @@ -6,8 +6,27 @@ export default { name: "register-media-optimization-upload-processor", initialize(container) { - let siteSettings = container.lookup("service:site-settings"); + const siteSettings = container.lookup("service:site-settings"); + const capabilities = container.lookup("capabilities:main"); + if (siteSettings.composer_media_optimization_image_enabled) { + // NOTE: There are various performance issues with the Canvas + // in iOS Safari that are causing crashes when processing images + // with spikes of over 100% CPU usage. The cause of this is unknown, + // but profiling points to CanvasRenderingContext2D.getImageData() + // and CanvasRenderingContext2D.drawImage(). + // + // Until Safari makes some progress with OffscreenCanvas or other + // alternatives we cannot support this workflow. + // + // TODO (martin): Revisit around 2022-06-01 to see the state of iOS Safari. + if ( + capabilities.isIOS && + !siteSettings.composer_ios_media_optimisation_image_enabled + ) { + return; + } + addComposerUploadPreProcessor( UppyMediaOptimization, ({ isMobileDevice }) => { diff --git a/config/site_settings.yml b/config/site_settings.yml index 6c7e37640b..599e0de852 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1549,6 +1549,10 @@ files: default: false client: true hidden: true + composer_ios_media_optimisation_image_enabled: + default: false + client: true + hidden: true trust: default_trust_level: