From 4ee348a2021f80f23b1063841acf7402b020ddcb Mon Sep 17 00:00:00 2001 From: Andrei Volykhin Date: Wed, 25 Jun 2025 10:20:12 +0300 Subject: [PATCH] imagebitmap: Add 'none' image orientation option (#37634) The 'none' image orientation option was temporarily deprecated (in 2022) according to HTML specification with the remark about going to be reused with a different meaning in future as the same semantics as CSS 'none' image-orientation. https://html.spec.whatwg.org/multipage/#dom-imagebitmapoptions-imageorientation-none https://www.w3.org/TR/css-images-3/#valdef-image-orientation-none Official MDN documentation added it back with new meaning (in 2024), but it wasn't added back to HTML specification (still pending). https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap#none At current moment this option is poor supported on all major browsers, but there are some existed WPT tests (ImageBitmap/WebGL) which are actively use it in createImageBitmap() options. Chromium (supported): - stable: same as 'from-image' (but with deprecation warning) - experimental: ignoring any orientation metadata Firefox (supported as default option): - stable: ignoring any orientation metadata ('from-image' do the same) Testing: Improvements and fails (expects 'from-image' behaviour from 'none' option) in the following tests - html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation_none.html - webgl/tests/conformance/textures/misc/exif-orientation.html Fixes (partialy): #34112 Signed-off-by: Andrei Volykhin --- .../webidls/ImageBitmap.webidl | 2 +- ...ImageBitmap-exif-orientation_none.html.ini | 25 - .../textures/misc/exif-orientation.html.ini | 962 +++++++++++++++++- 3 files changed, 960 insertions(+), 29 deletions(-) delete mode 100644 tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation_none.html.ini diff --git a/components/script_bindings/webidls/ImageBitmap.webidl b/components/script_bindings/webidls/ImageBitmap.webidl index b9b811eb9bd..31230ab9b22 100644 --- a/components/script_bindings/webidls/ImageBitmap.webidl +++ b/components/script_bindings/webidls/ImageBitmap.webidl @@ -20,7 +20,7 @@ typedef (CanvasImageSource or Blob or ImageData) ImageBitmapSource; -enum ImageOrientation { "from-image", "flipY" }; +enum ImageOrientation { "from-image", "flipY", "none" }; enum PremultiplyAlpha { "none", "premultiply", "default" }; enum ColorSpaceConversion { "none", "default" }; enum ResizeQuality { "pixelated", "low", "medium", "high" }; diff --git a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation_none.html.ini b/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation_none.html.ini deleted file mode 100644 index fbf7ca7b24b..00000000000 --- a/tests/wpt/meta/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation_none.html.ini +++ /dev/null @@ -1,25 +0,0 @@ -[createImageBitmap-exif-orientation_none.html] - expected: ERROR - [createImageBitmap with Orientation 1] - expected: TIMEOUT - - [createImageBitmap with Orientation 2] - expected: TIMEOUT - - [createImageBitmap with Orientation 3] - expected: TIMEOUT - - [createImageBitmap with Orientation 4] - expected: TIMEOUT - - [createImageBitmap with Orientation 5] - expected: TIMEOUT - - [createImageBitmap with Orientation 6] - expected: TIMEOUT - - [createImageBitmap with Orientation 7] - expected: TIMEOUT - - [createImageBitmap with Orientation 8] - expected: TIMEOUT diff --git a/tests/wpt/webgl/meta/conformance/textures/misc/exif-orientation.html.ini b/tests/wpt/webgl/meta/conformance/textures/misc/exif-orientation.html.ini index 8037c7ddf88..e4db593fafe 100644 --- a/tests/wpt/webgl/meta/conformance/textures/misc/exif-orientation.html.ini +++ b/tests/wpt/webgl/meta/conformance/textures/misc/exif-orientation.html.ini @@ -1,4 +1,960 @@ [exif-orientation.html] - expected: ERROR - [Overall test] - expected: NOTRUN + [WebGL test #65] + expected: FAIL + + [WebGL test #66] + expected: FAIL + + [WebGL test #69] + expected: FAIL + + [WebGL test #70] + expected: FAIL + + [WebGL test #73] + expected: FAIL + + [WebGL test #74] + expected: FAIL + + [WebGL test #77] + expected: FAIL + + [WebGL test #78] + expected: FAIL + + [WebGL test #81] + expected: FAIL + + [WebGL test #82] + expected: FAIL + + [WebGL test #85] + expected: FAIL + + [WebGL test #86] + expected: FAIL + + [WebGL test #89] + expected: FAIL + + [WebGL test #90] + expected: FAIL + + [WebGL test #93] + expected: FAIL + + [WebGL test #94] + expected: FAIL + + [WebGL test #97] + expected: FAIL + + [WebGL test #98] + expected: FAIL + + [WebGL test #101] + expected: FAIL + + [WebGL test #102] + expected: FAIL + + [WebGL test #105] + expected: FAIL + + [WebGL test #106] + expected: FAIL + + [WebGL test #109] + expected: FAIL + + [WebGL test #110] + expected: FAIL + + [WebGL test #113] + expected: FAIL + + [WebGL test #114] + expected: FAIL + + [WebGL test #117] + expected: FAIL + + [WebGL test #118] + expected: FAIL + + [WebGL test #121] + expected: FAIL + + [WebGL test #122] + expected: FAIL + + [WebGL test #125] + expected: FAIL + + [WebGL test #126] + expected: FAIL + + [WebGL test #128] + expected: FAIL + + [WebGL test #129] + expected: FAIL + + [WebGL test #130] + expected: FAIL + + [WebGL test #131] + expected: FAIL + + [WebGL test #132] + expected: FAIL + + [WebGL test #133] + expected: FAIL + + [WebGL test #134] + expected: FAIL + + [WebGL test #135] + expected: FAIL + + [WebGL test #136] + expected: FAIL + + [WebGL test #137] + expected: FAIL + + [WebGL test #138] + expected: FAIL + + [WebGL test #139] + expected: FAIL + + [WebGL test #140] + expected: FAIL + + [WebGL test #141] + expected: FAIL + + [WebGL test #142] + expected: FAIL + + [WebGL test #143] + expected: FAIL + + [WebGL test #144] + expected: FAIL + + [WebGL test #145] + expected: FAIL + + [WebGL test #146] + expected: FAIL + + [WebGL test #147] + expected: FAIL + + [WebGL test #148] + expected: FAIL + + [WebGL test #149] + expected: FAIL + + [WebGL test #150] + expected: FAIL + + [WebGL test #151] + expected: FAIL + + [WebGL test #152] + expected: FAIL + + [WebGL test #153] + expected: FAIL + + [WebGL test #154] + expected: FAIL + + [WebGL test #155] + expected: FAIL + + [WebGL test #156] + expected: FAIL + + [WebGL test #157] + expected: FAIL + + [WebGL test #158] + expected: FAIL + + [WebGL test #159] + expected: FAIL + + [WebGL test #160] + expected: FAIL + + [WebGL test #161] + expected: FAIL + + [WebGL test #162] + expected: FAIL + + [WebGL test #163] + expected: FAIL + + [WebGL test #164] + expected: FAIL + + [WebGL test #165] + expected: FAIL + + [WebGL test #166] + expected: FAIL + + [WebGL test #167] + expected: FAIL + + [WebGL test #168] + expected: FAIL + + [WebGL test #169] + expected: FAIL + + [WebGL test #170] + expected: FAIL + + [WebGL test #171] + expected: FAIL + + [WebGL test #172] + expected: FAIL + + [WebGL test #173] + expected: FAIL + + [WebGL test #174] + expected: FAIL + + [WebGL test #175] + expected: FAIL + + [WebGL test #176] + expected: FAIL + + [WebGL test #177] + expected: FAIL + + [WebGL test #178] + expected: FAIL + + [WebGL test #179] + expected: FAIL + + [WebGL test #180] + expected: FAIL + + [WebGL test #181] + expected: FAIL + + [WebGL test #182] + expected: FAIL + + [WebGL test #183] + expected: FAIL + + [WebGL test #184] + expected: FAIL + + [WebGL test #185] + expected: FAIL + + [WebGL test #186] + expected: FAIL + + [WebGL test #187] + expected: FAIL + + [WebGL test #188] + expected: FAIL + + [WebGL test #189] + expected: FAIL + + [WebGL test #190] + expected: FAIL + + [WebGL test #191] + expected: FAIL + + [WebGL test #192] + expected: FAIL + + [WebGL test #195] + expected: FAIL + + [WebGL test #196] + expected: FAIL + + [WebGL test #199] + expected: FAIL + + [WebGL test #200] + expected: FAIL + + [WebGL test #203] + expected: FAIL + + [WebGL test #204] + expected: FAIL + + [WebGL test #207] + expected: FAIL + + [WebGL test #208] + expected: FAIL + + [WebGL test #211] + expected: FAIL + + [WebGL test #212] + expected: FAIL + + [WebGL test #215] + expected: FAIL + + [WebGL test #216] + expected: FAIL + + [WebGL test #219] + expected: FAIL + + [WebGL test #220] + expected: FAIL + + [WebGL test #223] + expected: FAIL + + [WebGL test #224] + expected: FAIL + + [WebGL test #227] + expected: FAIL + + [WebGL test #228] + expected: FAIL + + [WebGL test #231] + expected: FAIL + + [WebGL test #232] + expected: FAIL + + [WebGL test #235] + expected: FAIL + + [WebGL test #236] + expected: FAIL + + [WebGL test #239] + expected: FAIL + + [WebGL test #240] + expected: FAIL + + [WebGL test #243] + expected: FAIL + + [WebGL test #244] + expected: FAIL + + [WebGL test #247] + expected: FAIL + + [WebGL test #248] + expected: FAIL + + [WebGL test #251] + expected: FAIL + + [WebGL test #252] + expected: FAIL + + [WebGL test #255] + expected: FAIL + + [WebGL test #256] + expected: FAIL + + [WebGL test #258] + expected: FAIL + + [WebGL test #259] + expected: FAIL + + [WebGL test #260] + expected: FAIL + + [WebGL test #262] + expected: FAIL + + [WebGL test #263] + expected: FAIL + + [WebGL test #264] + expected: FAIL + + [WebGL test #265] + expected: FAIL + + [WebGL test #267] + expected: FAIL + + [WebGL test #268] + expected: FAIL + + [WebGL test #269] + expected: FAIL + + [WebGL test #271] + expected: FAIL + + [WebGL test #272] + expected: FAIL + + [WebGL test #273] + expected: FAIL + + [WebGL test #275] + expected: FAIL + + [WebGL test #276] + expected: FAIL + + [WebGL test #277] + expected: FAIL + + [WebGL test #279] + expected: FAIL + + [WebGL test #280] + expected: FAIL + + [WebGL test #282] + expected: FAIL + + [WebGL test #283] + expected: FAIL + + [WebGL test #284] + expected: FAIL + + [WebGL test #286] + expected: FAIL + + [WebGL test #287] + expected: FAIL + + [WebGL test #288] + expected: FAIL + + [WebGL test #289] + expected: FAIL + + [WebGL test #291] + expected: FAIL + + [WebGL test #292] + expected: FAIL + + [WebGL test #293] + expected: FAIL + + [WebGL test #295] + expected: FAIL + + [WebGL test #296] + expected: FAIL + + [WebGL test #298] + expected: FAIL + + [WebGL test #299] + expected: FAIL + + [WebGL test #300] + expected: FAIL + + [WebGL test #302] + expected: FAIL + + [WebGL test #303] + expected: FAIL + + [WebGL test #304] + expected: FAIL + + [WebGL test #305] + expected: FAIL + + [WebGL test #307] + expected: FAIL + + [WebGL test #308] + expected: FAIL + + [WebGL test #309] + expected: FAIL + + [WebGL test #311] + expected: FAIL + + [WebGL test #312] + expected: FAIL + + [WebGL test #313] + expected: FAIL + + [WebGL test #315] + expected: FAIL + + [WebGL test #316] + expected: FAIL + + [WebGL test #317] + expected: FAIL + + [WebGL test #319] + expected: FAIL + + [WebGL test #320] + expected: FAIL + + [WebGL test #321] + expected: FAIL + + [WebGL test #323] + expected: FAIL + + [WebGL test #324] + expected: FAIL + + [WebGL test #325] + expected: FAIL + + [WebGL test #327] + expected: FAIL + + [WebGL test #328] + expected: FAIL + + [WebGL test #330] + expected: FAIL + + [WebGL test #331] + expected: FAIL + + [WebGL test #332] + expected: FAIL + + [WebGL test #334] + expected: FAIL + + [WebGL test #335] + expected: FAIL + + [WebGL test #336] + expected: FAIL + + [WebGL test #338] + expected: FAIL + + [WebGL test #339] + expected: FAIL + + [WebGL test #340] + expected: FAIL + + [WebGL test #342] + expected: FAIL + + [WebGL test #343] + expected: FAIL + + [WebGL test #344] + expected: FAIL + + [WebGL test #345] + expected: FAIL + + [WebGL test #347] + expected: FAIL + + [WebGL test #348] + expected: FAIL + + [WebGL test #349] + expected: FAIL + + [WebGL test #351] + expected: FAIL + + [WebGL test #352] + expected: FAIL + + [WebGL test #354] + expected: FAIL + + [WebGL test #355] + expected: FAIL + + [WebGL test #356] + expected: FAIL + + [WebGL test #358] + expected: FAIL + + [WebGL test #359] + expected: FAIL + + [WebGL test #360] + expected: FAIL + + [WebGL test #361] + expected: FAIL + + [WebGL test #363] + expected: FAIL + + [WebGL test #364] + expected: FAIL + + [WebGL test #365] + expected: FAIL + + [WebGL test #367] + expected: FAIL + + [WebGL test #368] + expected: FAIL + + [WebGL test #370] + expected: FAIL + + [WebGL test #371] + expected: FAIL + + [WebGL test #372] + expected: FAIL + + [WebGL test #374] + expected: FAIL + + [WebGL test #375] + expected: FAIL + + [WebGL test #376] + expected: FAIL + + [WebGL test #378] + expected: FAIL + + [WebGL test #379] + expected: FAIL + + [WebGL test #380] + expected: FAIL + + [WebGL test #382] + expected: FAIL + + [WebGL test #383] + expected: FAIL + + [WebGL test #384] + expected: FAIL + + [WebGL test #385] + expected: FAIL + + [WebGL test #387] + expected: FAIL + + [WebGL test #388] + expected: FAIL + + [WebGL test #389] + expected: FAIL + + [WebGL test #391] + expected: FAIL + + [WebGL test #392] + expected: FAIL + + [WebGL test #394] + expected: FAIL + + [WebGL test #395] + expected: FAIL + + [WebGL test #396] + expected: FAIL + + [WebGL test #398] + expected: FAIL + + [WebGL test #399] + expected: FAIL + + [WebGL test #400] + expected: FAIL + + [WebGL test #402] + expected: FAIL + + [WebGL test #403] + expected: FAIL + + [WebGL test #404] + expected: FAIL + + [WebGL test #406] + expected: FAIL + + [WebGL test #407] + expected: FAIL + + [WebGL test #408] + expected: FAIL + + [WebGL test #409] + expected: FAIL + + [WebGL test #411] + expected: FAIL + + [WebGL test #412] + expected: FAIL + + [WebGL test #413] + expected: FAIL + + [WebGL test #415] + expected: FAIL + + [WebGL test #416] + expected: FAIL + + [WebGL test #418] + expected: FAIL + + [WebGL test #419] + expected: FAIL + + [WebGL test #420] + expected: FAIL + + [WebGL test #422] + expected: FAIL + + [WebGL test #423] + expected: FAIL + + [WebGL test #424] + expected: FAIL + + [WebGL test #425] + expected: FAIL + + [WebGL test #427] + expected: FAIL + + [WebGL test #428] + expected: FAIL + + [WebGL test #429] + expected: FAIL + + [WebGL test #431] + expected: FAIL + + [WebGL test #432] + expected: FAIL + + [WebGL test #434] + expected: FAIL + + [WebGL test #435] + expected: FAIL + + [WebGL test #436] + expected: FAIL + + [WebGL test #438] + expected: FAIL + + [WebGL test #439] + expected: FAIL + + [WebGL test #440] + expected: FAIL + + [WebGL test #442] + expected: FAIL + + [WebGL test #443] + expected: FAIL + + [WebGL test #444] + expected: FAIL + + [WebGL test #446] + expected: FAIL + + [WebGL test #447] + expected: FAIL + + [WebGL test #448] + expected: FAIL + + [WebGL test #450] + expected: FAIL + + [WebGL test #451] + expected: FAIL + + [WebGL test #452] + expected: FAIL + + [WebGL test #454] + expected: FAIL + + [WebGL test #455] + expected: FAIL + + [WebGL test #456] + expected: FAIL + + [WebGL test #457] + expected: FAIL + + [WebGL test #459] + expected: FAIL + + [WebGL test #460] + expected: FAIL + + [WebGL test #461] + expected: FAIL + + [WebGL test #463] + expected: FAIL + + [WebGL test #464] + expected: FAIL + + [WebGL test #465] + expected: FAIL + + [WebGL test #467] + expected: FAIL + + [WebGL test #468] + expected: FAIL + + [WebGL test #469] + expected: FAIL + + [WebGL test #471] + expected: FAIL + + [WebGL test #472] + expected: FAIL + + [WebGL test #474] + expected: FAIL + + [WebGL test #475] + expected: FAIL + + [WebGL test #476] + expected: FAIL + + [WebGL test #478] + expected: FAIL + + [WebGL test #479] + expected: FAIL + + [WebGL test #480] + expected: FAIL + + [WebGL test #481] + expected: FAIL + + [WebGL test #483] + expected: FAIL + + [WebGL test #484] + expected: FAIL + + [WebGL test #485] + expected: FAIL + + [WebGL test #487] + expected: FAIL + + [WebGL test #488] + expected: FAIL + + [WebGL test #490] + expected: FAIL + + [WebGL test #491] + expected: FAIL + + [WebGL test #492] + expected: FAIL + + [WebGL test #494] + expected: FAIL + + [WebGL test #495] + expected: FAIL + + [WebGL test #496] + expected: FAIL + + [WebGL test #497] + expected: FAIL + + [WebGL test #499] + expected: FAIL + + [WebGL test #500] + expected: FAIL + + [WebGL test #501] + expected: FAIL + + [WebGL test #503] + expected: FAIL + + [WebGL test #504] + expected: FAIL + + [WebGL test #505] + expected: FAIL + + [WebGL test #507] + expected: FAIL + + [WebGL test #508] + expected: FAIL + + [WebGL test #509] + expected: FAIL + + [WebGL test #511] + expected: FAIL