From e8f1421f9036ed30e274cb34180dc2bc2c295aa4 Mon Sep 17 00:00:00 2001 From: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> Date: Thu, 19 Oct 2023 10:40:21 +0800 Subject: [PATCH 01/65] Add {{optional_inline}} to `Geolocation.getCurrentPosition()`'s params (#29647) Update index.md --- .../api/geolocation/getcurrentposition/index.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/files/en-us/web/api/geolocation/getcurrentposition/index.md b/files/en-us/web/api/geolocation/getcurrentposition/index.md index 7da4083852fcdfe..e6a01af3d04a40f 100644 --- a/files/en-us/web/api/geolocation/getcurrentposition/index.md +++ b/files/en-us/web/api/geolocation/getcurrentposition/index.md @@ -6,11 +6,9 @@ page-type: web-api-instance-method browser-compat: api.Geolocation.getCurrentPosition --- -{{securecontext_header}}{{ APIRef("Geolocation API") }} +{{securecontext_header}}{{APIRef("Geolocation API")}} -The -**`Geolocation.getCurrentPosition()`** method is used to get -the current position of the device. +The **`Geolocation.getCurrentPosition()`** method is used to get the current position of the device. ## Syntax @@ -30,11 +28,11 @@ getCurrentPosition(success, error, options) object as its sole input parameter. - `options` {{optional_inline}} - : An optional object including the following parameters: - - `maximumAge` - - : A positive `long` value indicating the maximum age in milliseconds of a possible cached position that is acceptable to return. If set to `0`, it means that the device cannot use a cached position and must attempt to retrieve the real current position. If set to [`Infinity`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity) the device must return a cached position regardless of its age. Default: 0. - - `timeout` + - `maximumAge` {{optional_inline}} + - : A positive `long` value indicating the maximum age in milliseconds of a possible cached position that is acceptable to return. If set to `0`, it means that the device cannot use a cached position and must attempt to retrieve the real current position. If set to [`Infinity`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity) the device must return a cached position regardless of its age. Default: `0`. + - `timeout` {{optional_inline}} - : A positive `long` value representing the maximum length of time (in milliseconds) the device is allowed to take in order to return a position. The default value is [`Infinity`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity), meaning that `getCurrentPosition()` won't return until the position is available. - - `enableHighAccuracy` + - `enableHighAccuracy` {{optional_inline}} - : A boolean value that indicates the application would like to receive the best possible results. If `true` and if the device is able to provide a more accurate position, it will do so. Note that this can result in slower response times or increased power consumption (with a GPS chip on a mobile device for example). On the other hand, if `false`, the device can take the liberty to save resources by responding more quickly and/or using less power. Default: `false`. ### Return value From 8685d6ebfdb0450c46454ee715cafaa53317a4e2 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 19 Oct 2023 11:27:24 +0200 Subject: [PATCH 02/65] Fix a typo in index.md (#29720) Fixes a typo ("wan't") --- .../http/headers/content-security-policy/script-src/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/http/headers/content-security-policy/script-src/index.md b/files/en-us/web/http/headers/content-security-policy/script-src/index.md index 956a5a52402f162..86bf8b8430c5c7d 100644 --- a/files/en-us/web/http/headers/content-security-policy/script-src/index.md +++ b/files/en-us/web/http/headers/content-security-policy/script-src/index.md @@ -199,7 +199,7 @@ Instead of allowing `'unsafe-inline'`, you can use the `'unsafe-hashes'` source Given a HTML page that includes the following inline event handler: ```html - + ``` From 29c6dda247bbe2443f2457df08f838031ec78442 Mon Sep 17 00:00:00 2001 From: Jason Ren <40999116+jasonren0403@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:35:57 +0800 Subject: [PATCH 03/65] fix: link to corresponding glossary (#29722) --- .../games/techniques/control_mechanisms/mobile_touch/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/games/techniques/control_mechanisms/mobile_touch/index.md b/files/en-us/games/techniques/control_mechanisms/mobile_touch/index.md index ff0d1a06fe94f6e..5906380ceedc6fd 100644 --- a/files/en-us/games/techniques/control_mechanisms/mobile_touch/index.md +++ b/files/en-us/games/techniques/control_mechanisms/mobile_touch/index.md @@ -8,7 +8,7 @@ page-type: guide {{NextMenu("Games/Techniques/Control_mechanisms/Desktop_with_mouse_and_keyboard", "Games/Techniques/Control_mechanisms")}} -The future of mobile gaming is definitely web, and many developers choose the [mobile first](/en-US/docs/Web/Apps/Mobile_First) approach in their game development process — in the modern world, this generally also involves implementing touch controls. In this tutorial, we will see how easy it is to implement mobile controls in an HTML game, and enjoy playing on a mobile touch-enabled device. +The future of mobile gaming is definitely web, and many developers choose the [mobile first](/en-US/docs/Glossary/Mobile_First) approach in their game development process — in the modern world, this generally also involves implementing touch controls. In this tutorial, we will see how easy it is to implement mobile controls in an HTML game, and enjoy playing on a mobile touch-enabled device. > **Note:** The game [Captain Rogers: Battle at Andromeda](https://rogers2.enclavegames.com/demo/) is built with Phaser and managing the controls is Phaser-based, but it could also be done in pure JavaScript. The good thing about using Phaser is that it offers helper variables and functions for easier and faster development, but it's entirely up to you which approach you to choose. From 5d7dd9c1b7672daa1314e1e513210acfecf6694a Mon Sep 17 00:00:00 2001 From: sentious <115402871+Sentious@users.noreply.github.com> Date: Thu, 19 Oct 2023 16:16:44 +0530 Subject: [PATCH 04/65] fixed image background (#29698) fixed background color for images which was unreadable in dark theme. Co-authored-by: Brian Thomas Smith --- .../web/http/content_negotiation/httpnego.png | Bin 9533 -> 9390 bytes .../http/content_negotiation/httpnego3.png | Bin 25166 -> 23361 bytes .../content_negotiation/httpnegoserver.png | Bin 23985 -> 19957 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/files/en-us/web/http/content_negotiation/httpnego.png b/files/en-us/web/http/content_negotiation/httpnego.png index 5d668c4ae22cf5120eee29a0938ad2dd9b6b37fb..3edbe5ae482ce2012585a66fdb517214d91bb3ed 100644 GIT binary patch literal 9390 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�ajmyBxup|Q;I-nEiU600r z_Z60D$DmJLwjFdQi$4r+dRC8G1;y_`+U{TSL)l-A5t}AG%e|}5rTJ@TcYTN1%N~%U zsW>&Ys>py=+{5`m?NfWQU?s^1&kTG_$c?zH0k@Ts%!xew*A^-Dn%dH+Nz!^Z>&{t+ zgssZ?7EHg_%YtjCHt|jUM2}5q|NMSZKnuzrkYQuiGQNsB%S}+ac0$BEVsJ{xYQ1i^ z0y8hBPf~W#VWH)!O*TJOf4Xj_=vCNsIl-myh{R0xQglV(C109YRpb4Eszy;5WSIf; zV=VhWnZiGe?>`{pWxY2(D$cd+{n5Q~BO!XQx3_m~5Nt<<*o~ovJ(Rnz{R#@j3AmSy zg2R(%Ns6jeN8Pn=RYu=bzxa5EzXLhi!!(wsW;d?yaU^wi;#^oB$&h^s2Loasdr2R> zf~}9R`x?Nr5f+~U2=RXA7bk9?a&yc3Gp?w)iR}jEl{9k^T%TH6Y6I@G&9x?|*=nj^ zga7OWTE_b*HqbuSCvFcf@#+;Y$`g^8eI7z8KM`xo{4N+IPu`LLLDyM`M+$4nymcc^ zBj~$)1+)^o(Qcqav96n*! z+=PrTtgSO{g)}PZ;VMG6M2$e(^@6j^;aeWUnc8f;V>T*TT{BbfaFtbcm&;%ex-q{7 zBAJsXHfiXXPi<5*KD2Zmt5vw!0V4F0>V#p=YAq+gZ@K!eCwTt{`?ZhO;*A&S!K9_< z$H#f-iSme4Ij?I9_@YV-a68HhCUs9(Jna~If2J$EEecXzgX*S%n){YV=-67oQqi@) zS|qN&0PlKkf#J-BPH~WoVoP*~aRJIBTXRsQZ5L!NuY(@m#GlL`?MvQV|Gr<$O&g%` zGdT?{z=5-~_SC98}=ApV7PcPdm3c=(vX!0BLYH8 zWQI{2<8KnW1b`g+&p`Sw7}r3t&ZX&;-emh;vyGgO#?F(fyPxVMm1Vsd-&_LK#)cl` zi2JI&Le#WKSuQ_16Jv)TXCs%5^V%4(ZS9E?4`~G@omihdV54nA9v!UhFl(YKu`1TGUv} zPYlMzydZV7{wfSN%h4QfX5$i*r{t($&3`qwYdpn9`gGUuk+57a^A9Lv7^1pIkjNbb z-_cgcbuv>Jwt5{ZwySlP#rkpZNJzf17Ib$k8%`Jao{ zwi3n?6O+^ibG`Qx6nl7zE8LIUIIiv6cZFpxZ*B|)?ABJwh|x^6#a`G>Aa^L**ppYw zo`pbl9?JM?gAJ3|WoeqhC*K2s^$vSM9XIVc9)02OI0kFw37fV4Y&PlhunbzWa7fpz zmP<_pu1U`~qkswW+oLHW-65p%Mu>+wmQ?~FLVmhs-2Q=53@f~?*5|kuLmN2O9ux^u zNaT{lk|yDku%?8CfRI2d6+3&;R;*@>SJcnhCTx?9`fl+;G^us3r%bkThh4qS#`xHM zq3?O(+y}ctnOoEpo9`@Hi{{iWwq}KN+W-1uD+&(lW#s;@5BU71&2e$=#F$&t&#oo- z!uwVo+1x+NW-K$fflchb#`~K9a)%hYG_Oo_Itx@>n^e%NXq;AhvR5Vg@V&TY_rZg* zimI+FsXWnq$a`UzEm2d~v#GdFWP*~~zOS#=6O`pXS}y#a(RXsNyK^YDrXYnT;eGGn z*B_mKW^SjijofSr+qlDjn~0u9H&l6A-rQKrCEA~I`g?y>uWw`hr^Mnkt^pUs|4Em! z+roN`EE^?zXDYo&$1bJ;MV4(E*ls`kH_>7CtInV_Fo9_t(Rf&eJLVf;hL5g!t8N8Z zpNCBvQRH0#I-vm{UG)ysS^}qOJ=}2F4M}=`q=XE-Nu?d7%kT<^&;gd`=_z&+4V~V? zP|HnIS=*%7m?z1;RAQC^oF45L3^`4a)@P5?g>@-Y@m)u_r;#Zbnw8Eea@c(=*thyg zxSQ&|WgNjc61|p`hnq8d8u2!2Gnn}&zlU*f(4g0An%K9X-RBT5+`<@S;4t%$6YW++6ttk1 zmuaNp{i@+UiA85sNPI@ZRw}`jh@EDfVuE=k%|$NoHBgOMV(5vmG}6Zf9Y7af2<%S>b1Zb_Zt zJw&EF^!RpZOkgyDPh_;J?kDPVdwT`55&Xa>hd;Paf~f!{jNt%Phy1gSa5}Mc-}fH4`19gVipRN$wcK*+8zAYe%$l3K zyIsdiQQ6RqW=Mo^KByOnD5EfIca-42J3`Mx2{_6OQd6n94cLv732}k~wQX5^yNjXE^?(+1NG&e8+Vhi3xxunZfy>@JMjvxyrYN#2Sh! z_=gtZOpN`d)j?ySPuzp-JGXxsNt?^KaebpFigsrGW}ScQ=Y!y--Iq?t;3300EBI9I zyhdVY${Qhz<%U@m)%%7CfC-#vk;<{2Fg=;+x*2>Zb$4PDolg#9uyCbWtysD3tv-V- zQqJYuHeh;iUc2j61Z3Rf@Hi+1_(!`A?mCP0E|D>prtu}zUD{vK-^l3gg9NCq66(S# zuz6ceQ828mULim~1md}>bssE>)f@s5QhQ}y^hIYbgL>LF`&Ps7x@Wca(>H-K;9wkgf3g}wm_I5Kt^M%Q}4cM)B(aKyI*&8GJb(L$hqZ^UShAUc-b z(ZS4OIE~Y#wC>9i(Sx)e%kKYEyZrAO=D*Ia-B-XNxDmJ#@x5wcy$66+H{g_(UjLl{ zp;egZe{aozms>7~g%?mO9du4GX`SycT29BB0Ub%1B{ z-3rKLwWews&jr)b!U?cHXLhCwXE)D21HK==DeKBoik%(lK=-1d8mwTL!T;*QcP8S0 zlY^cOID@|ukuXK*`xfQxCbjrD%?qX|`uJpQdbFY`I8m@(^6=a1IQeM;od)BjvG|5Z zhI{zm$(;vXhF-tjtsyS|;2p56ypN`P2^>ulIr5!-r0gx=zD<}odqc&jB;T~Kt-U+~L;EzY{wI(-$sP{d-Z|KA0Y4{i}An%xF z!C(P=vr3`MhOkQuokcHu0Onr;;nrv|r?xOwqknOGtJv)=+)+9gO9#T$!0S_pwo^cl z>&yxFUG@u;Ap2uPKx%60aOql+?s_X-v%J7y?F6q+3mH>H_MO?|-eHeN!4&i5c#4;U zjWNY{ZI7GI)Xo70IIyD*^-#cc6Y1HCt2u)BTcAS&c8XwCG0_FKy@8;wCIbi+f2s;u z1=Y=Ip!RoyPt_d0WYd@aODJUSGfG$yb|7#e=yRLLE`&k~!MQ{_aN;t!W z`J{vYFUQR#0Eo~LIN}|+rNT%Kqub^G*scI^44NK5{zx7&KE-(KqT`|S)A520LFO+J zO#j~pG3(|p-!o?54*p*x{HEqmsP}ZozzZ#+&B^TQ;mVEj-(piI*jlU8aspFJN^d8) zbf*4Dt8`b)iRN}v=+67dXL=&``4;*#0bLuGZhcq>Xdt_wQ3Tx?fT;9s;eG0OHxtrn?LnRakwsPgbG^|)%Q z<@|(2mRW+`@E><38+^{I)RsaqrLxz0p$Ry3VVP4?PsFb#Q8RO7lx-aI`S(O=idU3g2rZ|KhKI>Dgp!CvPPm;>UhM-t3Bc zgngtf@^o1wv``Z@&8t@x7|@PcNP;eZKGb)hkF&L#I`7 z2b<)b|1Exlly#qKt3h7+zBHKGCJ~Sjcf8<;Hp{2nbl!!;TcZ5ugbUOgTp1TX&x^I} zb$rHLyY7A1n=PJ{Bi@BOmMuK~Df`6{T}@>v_*Zs2O=vj?(!N8N`p(13t2 zJg&(t(+yn-X#dG!-2!_gyS{hn-@pm6f(rTYq#(~P#Nwj!sq;VoihpzP$-7ACF54Ao zY99Lh^#TVOQpfO zGmGlZ`<_4e_I5&DyIxp<1I^=oI_c%yYNMyN&HdyzWrC4WRuPhS^8K|_K$CpGNbe;g z)8wG);(CGe#&SP<)MK7UZ;Cmd_v=N=C1#JV8#xA|R*; z5v5n@(tGbUh2+eQ@3+3S{{P;!?yNP*nSCi1hHA5pK1TAtJ4;W|=h%;&k1f#$Gbp#EYO(6CZ z0&(^nAIjDb98OtTqa~$f0Kkigh|d0c%cpFMRI$Bt$Goenlac*`qy7Di0L$yv0ihwG z0FVPx8*b_7xx2f2d;4&5abCJ~$4Dj-WmMcK*8iT)o(GL->oO-)_>7~45zQ$Gdy zYbQ7bG_G(rH#Is(<`}sr>`}lOHrAWx5Qq~<9vZ|07iSYGcIsN37rnvE!hDhAIP(?5 zODqUEA>NPxzx2$^yYf7IGA0IkI%oK=66WhKveR1|t1WIG{Mk4ZS2cL;;7I2YZ3yNco$*u`!-ALrEw4-a3M89O6yt#4t|*+0H9P@!ob#VlkX zE+G-)qxXA9>eB_%ZRz8U{r%q;kpD23bsLW2An3zH$?7GEQHa4_8$|y4w zVRE>6=~aG}sZWZboS?Sw$pjDm&jV}fmf?eyDN3A2oh^;L^(D$1hfAs&M41p4{^`!{ zUNvQTmbMrZEyenl9z{h(5sim8CHX?FQOUk0o>3XYzgtW4GI8I(mcH~CQ`XH)O`z-z zSt_2rZ*4x(SakZ5vYmylw4sNH_Jg-i{qvh={oU?6xyOY*dSYT_=lQ_SPDfZ&FF;xU zep!lN+xxisE`-}(5A!kBzm2%Q@W+wrRtPP1Rg-{`wXAsa(?h(?;;}o)1HKk7{W!QE zMP2%M-6x{`!twKOew>Qbj*mQL6mm3PV1V=ETeDBDBdDJJx_(b*gN^HOXT^~@A(Q0K87h4tG5a7%M2Z*>2gZ6gM@Ml zE?@OLxyo{F9^wL{U2Mv^n@o|OOp+Vt5_cy>KVo;blC;iw+^$&bkFT_UJ9}5VRDBN` zvle}qr_vg$>2YMzg08%T(N*1M)Y%vjUa*foFd%7E1ZQ-J+SYn}bh9hC+y%*FeKLJl zclFP5Tb2i;f0~t`6kK&b?N*qy%=BG`pSHYYyy$1977gOHJbXc6A$^V|=9lWUH{JS{ z@IX~;cW(fYvY&e*wtuqw%+qu@(?Y*v2^V&{#Td(;AI>9phxV>j2v%Y}ogWcSM?nra zr02Z7@yIR7PCZ*V<5L{G*l>tU{mL+V(V#{09q`)MB3)2d^P)-pnz(r@gx={mVoDug zS2QYCR|ieAxT>ddPv+$AHdl9?Xc5tZCo4%P6+4cw2mRc?B@Z7INO5LTsj)Rf3N3#a zTTF^&BeU3xgA12D+kYv2ik$|P&Wjq&F2>9@p-pBsj#>xMj};tsan<8ZYWt`N2FVJ# z8K)6H{sCP3+ez;Ch3*NTVM}R!t9tQ#l7gfhn756XMkRTwPcG^`kIiu4ws=9_JYPpI zL6KX%T^Zj>`VyW!{7%$~`i%Y`#c}aqZ2M-@)^Mur-n z`P#%K=Ks@2!Ds$b!6`4hT3Sop4g2K46}L4Z#diIh@vjtDFhgQ4nF&>X>K+fX?sI9_ z;=7v0MeCzgyy$g~y0&B132|0=Z^N>yLznW~ruOCfE4)5623S~zKI^V$%zDt@XR?VA zPwtbf9;tJF|NJY<`1X!x`&-pIjOWl$`O_>_F)v57YXau(m6hFC=ltfpQ~~3VY(M#e zDn4GiV%`vRf7BU9x9Qo=ZO&Es^yczA%R#b|P1=ESg7_~_UXa>tYLeP58Yv>{D~l?_ zzHM`dkhn`6ensb4F}|h8iKRjJ z#LR0>V~Qr`za{eztd;M{$07`Kmb@An2g0RrVor9&L*W36#8sx0vfzAWAU+RnRP z?$U>vyMk%eWlYT$5hn39X~Ho--L&^4xaVteg8ke4>#8S|LrzPy$YdS&bTI!gk!o4l z7xc|Yx;Nx*yE~8dDQL`fqIIP(HI*^W(s$j|M|uBUprqVxQZY2Hjs3XSWUJ5@DI(vB~p2-FO zQ*N$?q2^eCk$Yf}LT`w(XU!|Kub0j%p5?hRv;MvGYmR8q6>I`Yaj>E{7B^|9F0)D( zw(Q)(BwpmICCAS_@Djb%5p&lNAYmTm|@(Sq3#= z^EHUN{JrBeOxH|CtGW(~)qyD6W1#-=Ayh=r+_4r{>0pbgU^x*}GP)1?DZgjW>g9t) z52j6AK=oxk@Ih9Bz`{NOOjp85-%>v;wLl^2;(vB=3vB7dbKe%A&U2>vt@D-SZiDT~ z2vdgF+aP|Tc5Zo{5-`s|I*bLD<993 z7m<5`MQeR-vLsERUg2QCu(6RQ+}`d^1l&C}P6YgD%`Fm8>8UgC-^-ZHUxVg#{TAO> z8$YR@bEt>P5HRExOg=o?qbRvuw})HcPJMrM4;c%;C<3W#TJYfspjbs8DmRUKB@Vhr z4}j**dq;T4V;VKd`#p~qU78>2m9F+gkaM)daToplb={;ZLHy}S-=C0#0UR9WGz1g`Tm+%RTPq+l1)$>QrK6zuzDD4yrcFQ_b%JXu5pO#)d+ z<9(DD-K+O!vM5*Qp*8F`V9p{rNZqU6E%ZJV_Vq3S60z;iT-ol9WGxeiDuNaJns7=^ zX5OZz1MJ%`NSzZ()V&%7Yo;UuUgilBPDO7;t2zZQ%)s{8I8@F2Tl41UOas6m&7ozphmf0IPl7o^GJvUjo%m4#5MgXu1k=}~Hc@&#~+r~-^BM4TyJY1TXN zPJtRLa#x_=2Xuy0s5{p{JMJy2llXEfcSyU4KDS^BVqp347))IzgW1Nj-e=u9OyJL% z*#8m5>l1`k3;STbq@cqw*X~7vYZp?p3;m|4^U=4 z#P-tto<`jo1$2$jyU@nQ9j&bY1fMyx8_Q`9tdUe)ibMWm*O|PnUJ(52ZL?g)M~4tT z73MJ(<+}EmnxlZ5xi&;V6s#{nXW@tfJUZBTcXxPLCfKBWt~?+GmsxkF+d~ZXE&e+) zT`DfE=5-p3H0%xu!(Y(hQX+J%N>Z9es_|`t*U{R)KwIu$Xfz(@^aI-3gQ3ax#Laa| zMUXQ@jo7q<7eT4}j72rS1QXL6Hl2nTW@~W;pu%5#LeInn@uT!jYw;t_UPmos{@ho8 zG;e5S7~g$!UuQZcC+fVRkf^T_L%fJkl4zMjJuM^sV8wa9(xXRIRiFG+QD?sgDr=L{ zTRY}tlE1nn9~^eQby>{Q3d48R`a5pOv4;k}xCM!R4dQLG3y>!D#%;e3D}o7`Kg?ltaj%Bt2;ul z?IR7lNsAbxdAS@yybTvt)=I!bwGcv@V<*=0QcwUU0mNm zcg+;?Mgl}jtdtCb0j#>j5*h>!&7gzUTrb@`C6X+5r(}Oq&F(((G z$s6+7QpK9>63hoKE07Aw!Vp|O%BKeVn_HPKR{v!JP&?M8SGYH9{iA$nZ!w?p8j9L0 z<%Q*T!ls0yP7VQ6CtqMfD@s@Wsl@9MB~uqL!~7qK$mv@%>>U=i0t&&{{zEqc_9;0zZR(iAyY}9){0Ush2_x7j zmz}JZ5Dz4H=L2_?abVhU$$_QG`(@7)WZx+7OfGuM_TGdu0{2NI3nFs>esV^kJ%RQKE0IG!$-;c zh_5coLROAlrI0bV5mcfv&|6k^S)f)+M^;P8fFA9Fi$(RQhW>rbRiH?S5poBQCjs;s>Fu6e+kWxN`w0*{6qCr5zCr^EN)U9E_$b`UOY_00vyr2aLh-2GJU z`5!w@MX$;Td`@+qp&+034%ZP3w$P{H&VhJGa;9zs?}AHN%p%h;Mbv(kpLp$8l8e6E z1{5$+`X|(V;+YGuVwGlv4V1zj;x{%nGKYx$ejyJuT^?)x#fUl`?gM-0)>jo6M7aOL zY)KCVBy?s?c&2U!B@(L(lP{-lBejTYy>mGBb#ykI0t2kvIv7k(pMrSE??!H^k{8pC zjYdaA1gtG2Co36oW(ms$NbQL`mBo-iN$|;?Og$t*BRz<;@bGsS;s&RI?rqtr7BPbZvV;6#ET!&cNW>D#XH1%@- z&TA;6B{)THuNz*ocbJR>TegA(xjCF)T*kxVz4IDr4@`0I2S3S!gNvv+bG1_Hib?DK`5fRSO>5+CSsmRRM?KDzW^1+1-JS{XLRsNV|AgOR}VObXT?{Z zG7}6ofhjrY;j&2B;-K_?@x8OeA{RnxhvsV1=`Ki{+by_C`cDIps>3rW@azfud8w_w z<|0Gtb^&)N`$K~!fpm|;Bh-C;eSbQ`t9rrF+@idtloARw-Ux_;B|bl{ZA?C*|47klXez6Lm6hwNHn%)E z^Hzl33e;NNg-cyUljf4RcF?5g4|gpHXzFk zhd}o564KzEi_`0prXW)%qPQP?J75{^`nf-OEA3g2OfoF)xLdl(Ui_I{fW+IS$V451T?2Ltl?` z;&E*@hk`mZ&aQWtw-@?gIV`oK)bB)S`)7&eR~9AcUY zlQ${v%u3Uec+3P>GDBDmTswxjwM^!RK&LR1>^5pP-3JRUJ4RW7pu4s`s2$V9QqXs~ zp!PJ#@L=r+$5z3sUo8Z{EFK?J{_C!NKQz((D|a8O%v7Zu%I$WR`QVFnWKM*=UCs}{ zwh-~SUNs)>%mrtrA;Fi2)zUMH-EM;<>e~Ilv4X2H%d2P%|2udW;t}bifQ3GrWO3la zf&+<@@}xW;keN8in}vhemLUxS9&LDiR}3l>R|D0NWOKduR32M|f|}?F%2vEooJuvs zXrSg80AEd#{z44<6is4ZF1@K9`42l^hLz#&;6)r z6~*D@CX~#0jx;R(WEV25&9D|u5S67|LaV-an;|#z1l|KAhS|KElweU^dVUX>{$Req z{yVcUN~9A!U zp7$M}-=&j32kDG5SeJI8EvnTk7=Ko?h%6q>)4iMdhLIpkjJhy-NUR7dFJ~YJXZa>@ zoZZ31L9GPjB5^X?uRRGDf|K7Ta_ChHH9~Y*OSBwa(4v^noRr^L6G5VD)EfHkffzm?BfxL7m zH;k)H@Jm0N4n;D5@qrgh_0G9cL34J{^+V-$7pqw}uzTxT7X*#QEYk{i;~`#-MEb=;;O&$stNwB}mZNz|DjCq@xrG0a3F@! z<*d&~{}+B=T{W#f@)R!-@;z|hKl&HrZRkn4UOms7!ux@SKGJnI8S0F$EuP$g#d$T1 zHy>|3bu?zI7H964CysPI9Y}109zgu$zNMA6Lqpny`lH|yOcP>c{a`3EidU;a`u7yB z0Tu3Ydl2``;&(k12O%=UYGf%NgM=mc|a@m=A|xtn|i--m!6tq^ph3y?P1p~lm*!`G3W?2y=my*LDhBR zsM!wM1m^umr&wo;#po7bskj)xBsEj>KNCP9ar2quZZBuii;%pwH4Xea3SeTIA)0#@PMy`!!ab0Jt!v1IBa94~*}_8)?IuO+T<2g;E4 zk#!}1xcy^s%Rum%@7LD>4j%+(bOH`c?MJGj*1^6qs)3(27cgyN;8c#NMg`!ed+sAjuc9jkmyKsuwO>^|Osl*|& z`24P^g$GxtqM8C%*}>#%T38>(b*6uF<{V{B%2Qje-?(!n)uv&#khX9cl0Cd zlk$&+RP#+)q$`dTak0Kvt)J`F#|4wKc`V z*pJr$v05nc-hnw0f~>lsQ^Bp!_%4#>*$~;BIOeY;hyyd|klLBjzf-PL83KPs5wG#6 zdMb}O8Q?GR^+J-$))8gOWjq#h41HNFvjmbT2rup1$I6zYYo<|k6+5{AcEZGCKB{Ds zY7fx6-gJ((fRLN!ZTCV1HRd$um@|)d5bb z@A`wEP|_h7%FY%pAt5_X5?Ht!LDuI@nz>l;az6&x>=H3nR1DcHP;X5O9+^|B-%&^Q zAVS+s6Sc^e;2C(n+Tf5wf30>V5>)NQfFG9t5Y?~NoJf{a30XLFzI@hRnXUS{!l1_~rTypy zoX4fnzE5}Ll&`mBZXw+w!SmVkmz(^hL+%m4C$?ssX)t8*#dIDpaS=|ua~sd7pU_klP~2<-ijBbZY`7B4o4jo>NPRS`lUZaXVXr1o)R4r%Tn29b8+M5V zr$D&fwLX z!vA>heweV_IRZ;YAmh(xH00+0RQn&#X#T&|`5Qmo?}njL>XC;3mNNN2lq4#OboKVlk9g(bxyLhP^wEFw2)1;3JF9M4`_T*B9k#*`0_r)MSKjZz47 zK-&h%bjW6}%>+EX$T%KjY9WJ_WB=_Cs8=N|qPQg7vE0=qzFaDOkzC8Mj+i8y^-8hPSrw$!0PLi4SSj8^C>M&Q(mlJ~17eywGNQPi^-`aR3U z7XT=8BF8S=Pe`}Q*-<}R`nD}&f!@c$%=;SqiKjq~H0kK0Kj4^U*xCM4SBEY~E>})v zw1{lJzSMJahgJNf=q@f1b>(Jm(3`t_3)VY%*xmd2){htXgIf3Kq2{DdT$&5MvbhUg0r0uw2J$fM1mjm|5f4Hr0_?FB;g@J=FTwKD*P}(0= zL01y$_Al^+H8tqRT?wK%%2uFZO1Jii-mey0<7pHN{ls^B0*WsuK@zkUDwE!PI(_6B zkpZCX-?j~3Weqbdw`%I$tWci6x&Y+4R9lWm4;VV^hkP=o4yd$$D;*Sh7x^*vP-nJh zyd4nHcwx;s?2BpS^_y7j3#_IWq5u4z$;NC6%^kj(jzfp}4+hMG^8|L^}v={zs)6&paFS%j! G`2PTgN2}jy9T!~*x>F?a0mnf!6jsH8$3uLxCHm$E&&1rClK7- z9q#0}_u1!s-#yQB|LU35-K%TW>Z*RL>Rn-~%CgU}Ut*)6pgfaV9;MtRqLBoSgja`KNnlckdoK?Bz5VjyVr~DjEIV?jx$N%l=JM+1`u5&T zjA3kS{L|;co4bdZ>1mc{IN@Po(H_Rv*Eg$O*;|{NfBq~!LqkJ*LVb6AZmef;cXKt? zR+*e$tfs1=sjX`vNqv2?ozb%L3I6Hq{BmVw_3+@}>hUoy4$;uiuzh@`Z1w5v>UMl~ z>H2g}OhSf(lP4?M7oT2jd1L!zd#QI~V`y-QjGSzK{TKxW+tke5#o75wdO9i^!Qt+f zzOL=&%I}4#;oHmO>#GY+0ZCLM$@7Dal5a&M0L+}+oY|qa@9hIC6MadaT)aY4-e@WA z9iDv-jdgeT=&8+XYHBJ@{&aM4E6UHMArEaUOFKK-PfAV+us3C*XSg~)y*N7t;xpwG zmCY_~P@|#@4Ud$!jRg4n1XwF7X<9V(PvAVmTirgf@Jc*fovp5}j?Achyj^lKbF%e_ zH1o)O?-%khz<+xA;A>TPZ+CZXeqwrY^Jq`Kq=K&bJ8xS9eVCqGK}OQg!9HsnTS0b+ zo0ZA0`JKndDPU5;X-qW{d+Ba0LPLPHwtFg12RvIFZ0H>i z%^Mt_-#A#E(tI1k$;tjHspwm>myn=nd3KT{GwIf7S!Z)S9w9NCxE>iJR9TS0CbZCA zo?TN_W_GykZA8t_l8D^mvZdt}ueTN@^#inwOlta;`ies4h8pX?dtTu^?<#&>ih`nx zA}1xG=`pweCCnsYy5(`C;%caqwLO5QE6xlq0Z69%T7?0coyGxBqieQfj4?Ai@=qDf zqhXTrzFhs&%S%6IWm`wDl$I-(n#N~4p8s9RyJ_CL>CWqr^5{0>eTMZ$3M$;}{pjIl z&ydLAY_Qxdxyt12S_b`Uh{|896+y3y*rmh;;g_%UkG-}5MBx5M~)X{Rg` zKD1NC1Q|bSi%yk?uf2R498J^5u=>kyoERvfBnZ8m-6S&OY1ZLjEFQ4BO-jY!wciSM z90|kTQOrsuk55=2(_Zsm#E)G7^&d3hK~F2AvCfC`;_*sqog?5>J%H z)e6COXUFL|1*SYOK9gN6(5dY#I$MR#%fHOc)?pN-bN!hVmmn=THf3T;ICZ>g&=}M_ zH2bHM98#tuko5voImg`HgWZ$1w*FPmlG{U$C}HBdo9ymdHD0FQ&kS<_kIyE|E{K!T zV|Hj~&A~-cKpqx-UV{%=uy$p3VWoUw6Yz7^3lfDXNK3~QL7lD{i{03hz&>iM&2RZt z!XvRk#xM@IL{pc4@JB~=su=#eUlSP=@6i0kCTKz2gBIN6f-D3amO8fjG1drdv*+c0 zgm+N#=Oz6Byd*G~E*-v5*rVk0WTzRI1e7Q68D=vJ#H+(|jB1b>%I3|q2`wQL`9>5T zUti(f4kWMx1D1s<60~>Ld3kw5Y@az1+$5*fz`Jp7Z3_Au&uNvMI~( zDtY)3&m_sYIU-JqOWKn_2l`B? z<`F~hH%<{P1`&Lys}9`ARQ51OG+)qlZTn@I-Chy^HODk9zbY0ZB@1F%`zth&H5>;* z*eUm=Qv#{8v@ZcL<$Y;A!Q6&tXrwFT9!L?%pkG@8{F2<+c;~L~LCiKf%`bxv9L*#- z$&-R;(qd+TA9<((Bq{?P(~pwlT&0{LQj;uzR&J;v^#;7ksA7_Q9klAT$s=jIgnXZY zmKt_f!Eug^L#IP{4)wnr!1YNf8`qW3Rz)=Mxn5@$O70OS?r~upQ+X@;ok-;|ihLy? zQzU(FQ2{Ob#P)CiRm^&7({3(lk}+#8EEGygj+wN)%weV5z^e|#VS!XG1q@%bUp>RTBUrqul1 zra#q4^p&usJsHr-S(Y&Q>Ac3Z&#d-rYDZuVWoITKuQB)3#)o#LC~!lY_1JaMkJIUy z5~U5;G3$Igr@r;?gx(9~Htyxrz=Tm!qPp%l2lH2H9ddSB@4{@^iwrA67hjA?b+X}; zw-i(|$ChxXbgD7HFsF z(>l8#&?|qtox9ZXQlq)KQogkE=g)0Tx!(&+#7lyO%32DWXfvC{KHlc~S@9Wve)+B# zY96L^P1X(`c=nOgHs-Mud*9+(!1Y4ugu5o#RrqyrHZ<3GGC*trX!e z-oI2w&6EY;D++yGr_r4T@;UKidVy#hd3id6ht(&V}Q!3xfbH!nNm=<=Of|z#}T}f>G-8|Zjo$3 zyQH)U_VPlo4&wT*tM%fpqJlFPBx}Cs>I|EDnq7GT590laT2M)Dzh~Xifd}0)l8WRl zz}CkdD{YLxX30e>aBP(yCe#@}hJ^7!&p|6kb=`Urhbf~qUG^GOh2kp7IS%f2 z7xLfT-uX9Hj_uT;4rUp8e6r?xqwhT2i>aK-R~!UT+*)#a8OYP8OV^I?8f&{Rp?BO?laM%b79}|O}UV8DsTIUlk)R-Y{wn1 zj_M@?`0OauL;T0y?)DMNeraA!&yk;=(y!^*53ipXKf818vit0u^?b)pdvD0J%8!4{ z_%mu0n3n#nKWVsn{}TT@<}g5TOLSK>xo5H%XCW_PYaYjyAquQ6Th;0tPkrp zc)vYWN!-i`>MI!2tZOcrqwHKVzT*CQ9PpB1l6(a>$-65-RFFq&yEB^G14TsE2XF_~ zO6E1e!33zj-al--OQ%|7@TN@@?<)kxW30SK9AQ>9{T?c;0+Kj?gS9b5<^N%<+GDRp(u7u5Blg-DN zfxokV(dwCw6G=JXNh!#hu+ZFVx>7nM#kk&g8Lg2Ir{ zOeQ-Od)`2LPiAJ-R{w6arx+00;he0|Q_KC7`O8_>eb^iCjtjFo2yM z$fcZ`2Es^-4wQgE{yhK|8Uh9f`ym)TXZ~FPmAB3I_Ob3b<~iYQE}DzDx(57jXu{zltCb zD)1C>61O#H8Y#7kbSem=3hkQNvI*t)O*mtA1OOa(@*4Wb==QMF+kV>bIca9R_~HC@ zORUVpDa*9U^}IxX{NwSDpE?g0XN-~+EeFPeIg^8I<_b-44eh+VvS5^*ss zOARr(kK8Br7i5OIzU8fIk?K_haUrqjbKU4DO}kjoL<{xWt&^WZzyIklM^^QD8YOmH zb#x?xffDod;a8qGz<(2tV$h?q=hMjy@F&55^hRpVQW$(lKo^roYcw$M#?U2ny?I58 z?l!UyDm?9Jdtqy_W#}vEttk$A0m<}L@Hl=ybHC!5b;aO_51ub(cmfDRg_^1v#y#0> zkAT}yD=EPMI~3rPOq%GsEUM<-xj27oI0_?KS&SiREFK6P`#t2T5};_95U6(MC}7w` z3Y1vjfu8t_tn^dj96IORVMQXu<(ozxK&&qd`h~xvw-~pD*k?p=D_H=bbqov)`~
~Q&aY|Oa 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 diff --git a/files/en-us/web/http/content_negotiation/httpnegoserver.png b/files/en-us/web/http/content_negotiation/httpnegoserver.png index cfbb9fbcb81cca36a99fbe83e6e60450b6704e08..b370bbb6d8f6a52e9df02dd6837608ae31569169 100644 GIT binary patch literal 19957 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 BV=@2$ literal 23985 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 Hw+#9pq)*a& From d929c4a2eeef6fb9c6a0bd260f30255235a7351e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 14:56:05 +0000 Subject: [PATCH 05/65] Bump lint-staged from 15.0.1 to 15.0.2 (#29727) --- package.json | 2 +- yarn.lock | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 5d9dff096dc294f..12867e8a1eb5bfc 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "gray-matter": "^4.0.3", "husky": "8.0.3", "js-yaml": "^4.1.0", - "lint-staged": "15.0.1", + "lint-staged": "15.0.2", "markdownlint-cli2": "0.10.0", "markdownlint-rule-search-replace": "1.2.0", "prettier": "3.0.3" diff --git a/yarn.lock b/yarn.lock index 802b8478dd8839c..d96d4aa71548ff2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4987,26 +4987,26 @@ linkify-it@^4.0.1: dependencies: uc.micro "^1.0.1" -lint-staged@15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.0.1.tgz#1db47c315c79bafe993aa33a0b50cbfeef50d906" - integrity sha512-2IU5OWmCaxch0X0+IBF4/v7sutpB+F3qoXbro43pYjQTOo5wumckjxoxn47pQBqqBsCWrD5HnI2uG/zJA7isew== +lint-staged@15.0.2: + version "15.0.2" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.0.2.tgz#abef713182ec2770143e40a5d6d0130fe61ed442" + integrity sha512-vnEy7pFTHyVuDmCAIFKR5QDO8XLVlPFQQyujQ/STOxe40ICWqJ6knS2wSJ/ffX/Lw0rz83luRDh+ET7toN+rOw== dependencies: chalk "5.3.0" commander "11.1.0" debug "4.3.4" execa "8.0.1" lilconfig "2.1.0" - listr2 "7.0.1" + listr2 "7.0.2" micromatch "4.0.5" pidtree "0.6.0" string-argv "0.3.2" - yaml "2.3.2" + yaml "2.3.3" -listr2@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-7.0.1.tgz#18e7a655b189cd7a8a76575a26f4d494b6ffc2c2" - integrity sha512-nz+7hwgbDp8eWNoDgzdl4hA/xDSLrNRzPu1TLgOYs6l5Y+Ma6zVWWy9Oyt9TQFONwKoSPoka3H50D3vD5EuNwg== +listr2@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-7.0.2.tgz#3aa3e1549dfaf3c57ab5eeaba754da3b87f33063" + integrity sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g== dependencies: cli-truncate "^3.1.0" colorette "^2.0.20" @@ -8533,6 +8533,11 @@ yaml@2.3.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== +yaml@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" + integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" From f3b609058e65ae9c53c790b250711f6398dd1dfe Mon Sep 17 00:00:00 2001 From: wbamberg Date: Thu, 19 Oct 2023 10:51:15 -0700 Subject: [PATCH 06/65] Fix 28465: Restore list of values to globalCompositeOperation page (#29718) * Fix 28465: Restore list of values to globalCompositeOperation page * Apply suggestions from code review Co-authored-by: sideshowbarker * Update files/en-us/web/api/canvasrenderingcontext2d/globalcompositeoperation/index.md Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: sideshowbarker Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- files/en-us/_redirects.txt | 3 +- files/en-us/_wikihistory.json | 4 - .../tutorial/compositing/example/index.md | 319 --------------- .../canvas_api/tutorial/compositing/index.md | 2 - .../globalcompositeoperation/index.md | 369 +++++++++++++++++- 5 files changed, 370 insertions(+), 327 deletions(-) delete mode 100644 files/en-us/web/api/canvas_api/tutorial/compositing/example/index.md diff --git a/files/en-us/_redirects.txt b/files/en-us/_redirects.txt index 4d9fdfd60f77ad9..88131a539ce53fc 100644 --- a/files/en-us/_redirects.txt +++ b/files/en-us/_redirects.txt @@ -7777,6 +7777,7 @@ /en-US/docs/Web/API/CanvasRenderingContext2D/mozImageSmoothingEnabled /en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled /en-US/docs/Web/API/CanvasRenderingContext2D/mozTextStyle /en-US/docs/Web/API/CanvasRenderingContext2D/font /en-US/docs/Web/API/Canvas_API/Drawing_graphics_with_canvas /en-US/docs/Web/API/Canvas_API/Tutorial +/en-US/docs/Web/API/Canvas_API/Tutorial/Compositing/Example /en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation /en-US/docs/Web/API/CharacterData.previousElementSibling /en-US/docs/Web/API/CharacterData/previousElementSibling /en-US/docs/Web/API/ChildNode.nextElementSibling /en-US/docs/Web/API/Element/nextElementSibling /en-US/docs/Web/API/ChildNode.remove /en-US/docs/Web/API/Element/remove @@ -12034,7 +12035,7 @@ /en-US/docs/Web/Guide/HTML/Canvas_tutorial/Basic_animations /en-US/docs/Web/API/Canvas_API/Tutorial/Basic_animations /en-US/docs/Web/Guide/HTML/Canvas_tutorial/Basic_usage /en-US/docs/Web/API/Canvas_API/Tutorial/Basic_usage /en-US/docs/Web/Guide/HTML/Canvas_tutorial/Compositing /en-US/docs/Web/API/Canvas_API/Tutorial/Compositing -/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Compositing/Example /en-US/docs/Web/API/Canvas_API/Tutorial/Compositing/Example +/en-US/docs/Web/Guide/HTML/Canvas_tutorial/Compositing/Example /en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation /en-US/docs/Web/Guide/HTML/Canvas_tutorial/Drawing_shapes /en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes /en-US/docs/Web/Guide/HTML/Canvas_tutorial/Optimizing_canvas /en-US/docs/Web/API/Canvas_API/Tutorial/Optimizing_canvas /en-US/docs/Web/Guide/HTML/Canvas_tutorial/Pixel_manipulation_with_canvas /en-US/docs/Web/API/Canvas_API/Tutorial/Pixel_manipulation_with_canvas diff --git a/files/en-us/_wikihistory.json b/files/en-us/_wikihistory.json index 94076fc666f5dc4..65670f7e23a2702 100644 --- a/files/en-us/_wikihistory.json +++ b/files/en-us/_wikihistory.json @@ -24687,10 +24687,6 @@ "trevorh" ] }, - "Web/API/Canvas_API/Tutorial/Compositing/Example": { - "modified": "2019-03-23T23:28:23.382Z", - "contributors": ["brttd", "beaugunderson", "jpmedley", "fscholz", "Sheppy"] - }, "Web/API/Canvas_API/Tutorial/Drawing_shapes": { "modified": "2020-08-05T11:19:13.950Z", "contributors": [ diff --git a/files/en-us/web/api/canvas_api/tutorial/compositing/example/index.md b/files/en-us/web/api/canvas_api/tutorial/compositing/example/index.md deleted file mode 100644 index 5be366f040b9d89..000000000000000 --- a/files/en-us/web/api/canvas_api/tutorial/compositing/example/index.md +++ /dev/null @@ -1,319 +0,0 @@ ---- -title: Compositing example -slug: Web/API/Canvas_API/Tutorial/Compositing/Example -page-type: guide ---- - -{{DefaultAPISidebar("Canvas API")}} - -This sample program demonstrates a number of [compositing operations](/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation). The output looks like this: - -{{EmbedLiveSample("Compositing_example", "100%", 7250)}} - -## Compositing example - -This code sets up the global values used by the rest of the program. - -```js -const canvas1 = document.createElement("canvas"); -const canvas2 = document.createElement("canvas"); -const gco = [ - "source-over", - "source-in", - "source-out", - "source-atop", - "destination-over", - "destination-in", - "destination-out", - "destination-atop", - "lighter", - "copy", - "xor", - "multiply", - "screen", - "overlay", - "darken", - "lighten", - "color-dodge", - "color-burn", - "hard-light", - "soft-light", - "difference", - "exclusion", - "hue", - "saturation", - "color", - "luminosity", -].reverse(); -const gcoText = [ - "This is the default setting and draws new shapes on top of the existing canvas content.", - "The new shape is drawn only where both the new shape and the destination canvas overlap. Everything else is made transparent.", - "The new shape is drawn where it doesn't overlap the existing canvas content.", - "The new shape is only drawn where it overlaps the existing canvas content.", - "New shapes are drawn behind the existing canvas content.", - "The existing canvas content is kept where both the new shape and existing canvas content overlap. Everything else is made transparent.", - "The existing content is kept where it doesn't overlap the new shape.", - "The existing canvas is only kept where it overlaps the new shape. The new shape is drawn behind the canvas content.", - "Where both shapes overlap the color is determined by adding color values.", - "Only the new shape is shown.", - "Shapes are made transparent where both overlap and drawn normal everywhere else.", - "The pixels of the top layer are multiplied with the corresponding pixel of the bottom layer. A darker picture is the result.", - "The pixels are inverted, multiplied, and inverted again. A lighter picture is the result (opposite of multiply)", - "A combination of multiply and screen. Dark parts on the base layer become darker, and light parts become lighter.", - "Retains the darkest pixels of both layers.", - "Retains the lightest pixels of both layers.", - "Divides the bottom layer by the inverted top layer.", - "Divides the inverted bottom layer by the top layer, and then inverts the result.", - "A combination of multiply and screen like overlay, but with top and bottom layer swapped.", - "A softer version of hard-light. Pure black or white does not result in pure black or white.", - "Subtracts the bottom layer from the top layer or the other way round to always get a positive value.", - "Like difference, but with lower contrast.", - "Preserves the luma and chroma of the bottom layer, while adopting the hue of the top layer.", - "Preserves the luma and hue of the bottom layer, while adopting the chroma of the top layer.", - "Preserves the luma of the bottom layer, while adopting the hue and chroma of the top layer.", - "Preserves the hue and chroma of the bottom layer, while adopting the luma of the top layer.", -].reverse(); -const width = 320; -const height = 340; -``` - -### Main program - -When the page loads, this code runs to set up and run the example: - -```js -window.onload = () => { - // lum in sRGB - const lum = { - r: 0.33, - g: 0.33, - b: 0.33, - }; - // resize canvas - canvas1.width = width; - canvas1.height = height; - canvas2.width = width; - canvas2.height = height; - lightMix(); - colorSphere(); - runComposite(); - return; -}; -``` - -And this code, `runComposite()`, handles the bulk of the work, relying on a number of utility functions to do the hard parts. - -```js -function createCanvas() { - const canvas = document.createElement("canvas"); - canvas.style.background = `url(${op_8x8.data})`; - canvas.style.border = "1px solid #000"; - canvas.style.margin = "5px"; - canvas.width = width / 2; - canvas.height = height / 2; - return canvas; -} - -function runComposite() { - const dl = document.createElement("dl"); - document.body.appendChild(dl); - while (gco.length) { - const pop = gco.pop(); - const dt = document.createElement("dt"); - dt.textContent = pop; - dl.appendChild(dt); - const dd = document.createElement("dd"); - const p = document.createElement("p"); - p.textContent = gcoText.pop(); - dd.appendChild(p); - - const canvasToDrawOn = createCanvas(); - const canvasToDrawFrom = createCanvas(); - const canvasToDrawResult = createCanvas(); - - let ctx = canvasToDrawResult.getContext("2d"); - ctx.clearRect(0, 0, width, height); - ctx.save(); - ctx.drawImage(canvas1, 0, 0, width / 2, height / 2); - ctx.globalCompositeOperation = pop; - ctx.drawImage(canvas2, 0, 0, width / 2, height / 2); - ctx.globalCompositeOperation = "source-over"; - ctx.fillStyle = "rgba(0,0,0,0.8)"; - ctx.fillRect(0, height / 2 - 20, width / 2, 20); - ctx.fillStyle = "#FFF"; - ctx.font = "14px arial"; - ctx.fillText(pop, 5, height / 2 - 5); - ctx.restore(); - - ctx = canvasToDrawOn.getContext("2d"); - ctx.clearRect(0, 0, width, height); - ctx.save(); - ctx.drawImage(canvas1, 0, 0, width / 2, height / 2); - ctx.fillStyle = "rgba(0,0,0,0.8)"; - ctx.fillRect(0, height / 2 - 20, width / 2, 20); - ctx.fillStyle = "#FFF"; - ctx.font = "14px arial"; - ctx.fillText("existing content", 5, height / 2 - 5); - ctx.restore(); - - ctx = canvasToDrawFrom.getContext("2d"); - ctx.clearRect(0, 0, width, height); - ctx.save(); - ctx.drawImage(canvas2, 0, 0, width / 2, height / 2); - ctx.fillStyle = "rgba(0,0,0,0.8)"; - ctx.fillRect(0, height / 2 - 20, width / 2, 20); - ctx.fillStyle = "#FFF"; - ctx.font = "14px arial"; - ctx.fillText("new content", 5, height / 2 - 5); - ctx.restore(); - - dd.appendChild(canvasToDrawOn); - dd.appendChild(canvasToDrawFrom); - dd.appendChild(canvasToDrawResult); - - dl.appendChild(dd); - } -} -``` - -### Utility functions - -The program relies on a number of utility functions. - -```js -const lightMix = () => { - const ctx = canvas2.getContext("2d"); - ctx.save(); - ctx.globalCompositeOperation = "lighter"; - ctx.beginPath(); - ctx.fillStyle = "rgba(255,0,0,1)"; - ctx.arc(100, 200, 100, Math.PI * 2, 0, false); - ctx.fill(); - ctx.beginPath(); - ctx.fillStyle = "rgba(0,0,255,1)"; - ctx.arc(220, 200, 100, Math.PI * 2, 0, false); - ctx.fill(); - ctx.beginPath(); - ctx.fillStyle = "rgba(0,255,0,1)"; - ctx.arc(160, 100, 100, Math.PI * 2, 0, false); - ctx.fill(); - ctx.restore(); - ctx.beginPath(); - ctx.fillStyle = "#f00"; - ctx.fillRect(0, 0, 30, 30); - ctx.fill(); -}; -``` - -```js -const colorSphere = (element) => { - const ctx = canvas1.getContext("2d"); - const width = 360; - const halfWidth = width / 2; - const rotate = (1 / 360) * Math.PI * 2; // per degree - const offset = 0; // scrollbar offset - const oleft = -20; - const otop = -20; - for (let n = 0; n <= 359; n++) { - const gradient = ctx.createLinearGradient( - oleft + halfWidth, - otop, - oleft + halfWidth, - otop + halfWidth, - ); - const color = Color.HSV_RGB({ H: (n + 300) % 360, S: 100, V: 100 }); - gradient.addColorStop(0, "rgba(0,0,0,0)"); - gradient.addColorStop(0.7, `rgba(${color.R}, ${color.G}, ${color.B}, 1)`); - gradient.addColorStop(1, "rgba(255,255,255,1)"); - ctx.beginPath(); - ctx.moveTo(oleft + halfWidth, otop); - ctx.lineTo(oleft + halfWidth, otop + halfWidth); - ctx.lineTo(oleft + halfWidth + 6, otop); - ctx.fillStyle = gradient; - ctx.fill(); - ctx.translate(oleft + halfWidth, otop + halfWidth); - ctx.rotate(rotate); - ctx.translate(-(oleft + halfWidth), -(otop + halfWidth)); - } - ctx.beginPath(); - ctx.fillStyle = "#00f"; - ctx.fillRect(15, 15, 30, 30); - ctx.fill(); - return ctx.canvas; -}; -``` - -```js -// HSV (1978) = H: Hue / S: Saturation / V: Value -Color = {}; -Color.HSV_RGB = (o) => { - const S = o.S / 100; - let H = o.H / 360, - V = o.V / 100; - let R, G; - let A, B, C, D; - if (S === 0) { - R = G = B = Math.round(V * 255); - } else { - if (H >= 1) H = 0; - H *= 6; - D = H - Math.floor(H); - A = Math.round(255 * V * (1 - S)); - B = Math.round(255 * V * (1 - S * D)); - C = Math.round(255 * V * (1 - S * (1 - D))); - V = Math.round(255 * V); - switch (Math.floor(H)) { - case 0: - R = V; - G = C; - B = A; - break; - case 1: - R = B; - G = V; - B = A; - break; - case 2: - R = A; - G = V; - B = C; - break; - case 3: - R = A; - G = B; - B = V; - break; - case 4: - R = C; - G = A; - B = V; - break; - case 5: - R = V; - G = A; - B = B; - break; - } - } - return { R, G, B }; -}; - -const createInterlace = (size, color1, color2) => { - const proto = document.createElement("canvas").getContext("2d"); - proto.canvas.width = size * 2; - proto.canvas.height = size * 2; - proto.fillStyle = color1; // top-left - proto.fillRect(0, 0, size, size); - proto.fillStyle = color2; // top-right - proto.fillRect(size, 0, size, size); - proto.fillStyle = color2; // bottom-left - proto.fillRect(0, size, size, size); - proto.fillStyle = color1; // bottom-right - proto.fillRect(size, size, size, size); - const pattern = proto.createPattern(proto.canvas, "repeat"); - pattern.data = proto.canvas.toDataURL(); - return pattern; -}; - -const op_8x8 = createInterlace(8, "#FFF", "#eee"); -``` diff --git a/files/en-us/web/api/canvas_api/tutorial/compositing/index.md b/files/en-us/web/api/canvas_api/tutorial/compositing/index.md index a1c5659d1240be4..0028a2fa62054c7 100644 --- a/files/en-us/web/api/canvas_api/tutorial/compositing/index.md +++ b/files/en-us/web/api/canvas_api/tutorial/compositing/index.md @@ -15,8 +15,6 @@ We can not only draw new shapes behind existing shapes but we can also use it to - {{domxref("CanvasRenderingContext2D.globalCompositeOperation", "globalCompositeOperation = type")}} - : This sets the type of compositing operation to apply when drawing new shapes, where type is a string identifying which of the twelve compositing operations to use. -For examples, see the [compositing example](/en-US/docs/Web/API/Canvas_API/Tutorial/Compositing/Example) page. - ## Clipping paths A clipping path is like a normal canvas shape but it acts as a mask to hide unwanted parts of shapes. This is visualized in the image below. The red star shape is our clipping path. Everything that falls outside of this path won't get drawn on the canvas. diff --git a/files/en-us/web/api/canvasrenderingcontext2d/globalcompositeoperation/index.md b/files/en-us/web/api/canvasrenderingcontext2d/globalcompositeoperation/index.md index 57ee8537dda87bf..3882685cb171ff1 100644 --- a/files/en-us/web/api/canvasrenderingcontext2d/globalcompositeoperation/index.md +++ b/files/en-us/web/api/canvasrenderingcontext2d/globalcompositeoperation/index.md @@ -17,7 +17,60 @@ See also [Compositing and clipping](/en-US/docs/Web/API/Canvas_API/Tutorial/Comp ## Value -A string identifying which of the compositing or blending mode operations to use. +A string identifying which of the compositing or blending mode operations to use. This may be any of the following values: + +- `"source-over"` + - : This is the default setting and draws new shapes on top of the existing canvas content. +- `"source-in"` + - : The new shape is drawn only where both the new shape and the destination canvas overlap. Everything else is made transparent. +- `"source-out"` + - : The new shape is drawn where it doesn't overlap the existing canvas content. +- `"source-atop"` + - : The new shape is only drawn where it overlaps the existing canvas content. +- `"destination-over"` + - : New shapes are drawn behind the existing canvas content. +- `"destination-in"` + - : The existing canvas content is kept where both the new shape and existing canvas content overlap. Everything else is made transparent. +- `"destination-out"` + - : The existing content is kept where it doesn't overlap the new shape. +- `"destination-atop"` + - : The existing canvas is only kept where it overlaps the new shape. The new shape is drawn behind the canvas content. +- `"lighter"` + - : Where both shapes overlap, the color is determined by adding color values. +- `"copy"` + - : Only the new shape is shown. +- `"xor"` + - : Shapes are made transparent where both overlap and drawn normal everywhere else. +- `"multiply"` + - : The pixels of the top layer are multiplied with the corresponding pixels of the bottom layer. A darker picture is the result. +- `"screen"` + - : The pixels are inverted, multiplied, and inverted again. A lighter picture is the result (opposite of `multiply`) +- `"overlay"` + - : A combination of `multiply` and `screen`. Dark parts on the base layer become darker, and light parts become lighter. +- `"darken"` + - : Retains the darkest pixels of both layers. +- `"lighten"` + - : Retains the lightest pixels of both layers. +- `"color-dodge"` + - : Divides the bottom layer by the inverted top layer. +- `"color-burn"` + - : Divides the inverted bottom layer by the top layer, and then inverts the result. +- `"hard-light"` + - : Like `overlay`, a combination of `multiply` and `screen` — but instead with the top layer and bottom layer swapped. +- `"soft-light"` + - : A softer version of `hard-light`. Pure black or white does not result in pure black or white. +- `"difference"` + - : Subtracts the bottom layer from the top layer — or the other way round — to always get a positive value. +- `"exclusion"` + - : Like `difference`, but with lower contrast. +- `"hue"` + - : Preserves the luma and chroma of the bottom layer, while adopting the hue of the top layer. +- `"saturation"` + - : Preserves the luma and hue of the bottom layer, while adopting the chroma of the top layer. +- `"color"` + - : Preserves the luma of the bottom layer, while adopting the hue and chroma of the top layer. +- `"luminosity"` + - : Preserves the hue and chroma of the bottom layer, while adopting the luma of the top layer. ## Examples @@ -51,6 +104,320 @@ ctx.fillRect(50, 50, 100, 100); {{ EmbedLiveSample('Changing_the_composite_operation', 700, 180) }} +### Demonstration of all values + +#### Global values + +This code sets up the global values used by the rest of the program. + +```js +const canvas1 = document.createElement("canvas"); +const canvas2 = document.createElement("canvas"); +const gco = [ + "source-over", + "source-in", + "source-out", + "source-atop", + "destination-over", + "destination-in", + "destination-out", + "destination-atop", + "lighter", + "copy", + "xor", + "multiply", + "screen", + "overlay", + "darken", + "lighten", + "color-dodge", + "color-burn", + "hard-light", + "soft-light", + "difference", + "exclusion", + "hue", + "saturation", + "color", + "luminosity", +].reverse(); +const gcoText = [ + "This is the default setting and draws new shapes on top of the existing canvas content.", + "The new shape is drawn only where both the new shape and the destination canvas overlap. Everything else is made transparent.", + "The new shape is drawn where it doesn't overlap the existing canvas content.", + "The new shape is only drawn where it overlaps the existing canvas content.", + "New shapes are drawn behind the existing canvas content.", + "The existing canvas content is kept where both the new shape and existing canvas content overlap. Everything else is made transparent.", + "The existing content is kept where it doesn't overlap the new shape.", + "The existing canvas is only kept where it overlaps the new shape. The new shape is drawn behind the canvas content.", + "Where both shapes overlap the color is determined by adding color values.", + "Only the new shape is shown.", + "Shapes are made transparent where both overlap and drawn normal everywhere else.", + "The pixels of the top layer are multiplied with the corresponding pixel of the bottom layer. A darker picture is the result.", + "The pixels are inverted, multiplied, and inverted again. A lighter picture is the result (opposite of multiply)", + "A combination of multiply and screen. Dark parts on the base layer become darker, and light parts become lighter.", + "Retains the darkest pixels of both layers.", + "Retains the lightest pixels of both layers.", + "Divides the bottom layer by the inverted top layer.", + "Divides the inverted bottom layer by the top layer, and then inverts the result.", + "A combination of multiply and screen like overlay, but with top and bottom layer swapped.", + "A softer version of hard-light. Pure black or white does not result in pure black or white.", + "Subtracts the bottom layer from the top layer or the other way round to always get a positive value.", + "Like difference, but with lower contrast.", + "Preserves the luma and chroma of the bottom layer, while adopting the hue of the top layer.", + "Preserves the luma and hue of the bottom layer, while adopting the chroma of the top layer.", + "Preserves the luma of the bottom layer, while adopting the hue and chroma of the top layer.", + "Preserves the hue and chroma of the bottom layer, while adopting the luma of the top layer.", +].reverse(); +const width = 320; +const height = 340; +``` + +#### Main program + +When the page loads, this code runs to set up and run the example: + +```js +window.onload = () => { + // lum in sRGB + const lum = { + r: 0.33, + g: 0.33, + b: 0.33, + }; + // resize canvas + canvas1.width = width; + canvas1.height = height; + canvas2.width = width; + canvas2.height = height; + lightMix(); + colorSphere(); + runComposite(); + return; +}; +``` + +And this code, `runComposite()`, handles the bulk of the work, relying on a number of utility functions to do the hard parts. + +```js +function createCanvas() { + const canvas = document.createElement("canvas"); + canvas.style.background = `url(${op_8x8.data})`; + canvas.style.border = "1px solid #000"; + canvas.style.margin = "5px"; + canvas.width = width / 2; + canvas.height = height / 2; + return canvas; +} + +function runComposite() { + const dl = document.createElement("dl"); + document.body.appendChild(dl); + while (gco.length) { + const pop = gco.pop(); + const dt = document.createElement("dt"); + dt.textContent = pop; + dl.appendChild(dt); + const dd = document.createElement("dd"); + const p = document.createElement("p"); + p.textContent = gcoText.pop(); + dd.appendChild(p); + + const canvasToDrawOn = createCanvas(); + const canvasToDrawFrom = createCanvas(); + const canvasToDrawResult = createCanvas(); + + let ctx = canvasToDrawResult.getContext("2d"); + ctx.clearRect(0, 0, width, height); + ctx.save(); + ctx.drawImage(canvas1, 0, 0, width / 2, height / 2); + ctx.globalCompositeOperation = pop; + ctx.drawImage(canvas2, 0, 0, width / 2, height / 2); + ctx.globalCompositeOperation = "source-over"; + ctx.fillStyle = "rgba(0,0,0,0.8)"; + ctx.fillRect(0, height / 2 - 20, width / 2, 20); + ctx.fillStyle = "#FFF"; + ctx.font = "14px arial"; + ctx.fillText(pop, 5, height / 2 - 5); + ctx.restore(); + + ctx = canvasToDrawOn.getContext("2d"); + ctx.clearRect(0, 0, width, height); + ctx.save(); + ctx.drawImage(canvas1, 0, 0, width / 2, height / 2); + ctx.fillStyle = "rgba(0,0,0,0.8)"; + ctx.fillRect(0, height / 2 - 20, width / 2, 20); + ctx.fillStyle = "#FFF"; + ctx.font = "14px arial"; + ctx.fillText("existing content", 5, height / 2 - 5); + ctx.restore(); + + ctx = canvasToDrawFrom.getContext("2d"); + ctx.clearRect(0, 0, width, height); + ctx.save(); + ctx.drawImage(canvas2, 0, 0, width / 2, height / 2); + ctx.fillStyle = "rgba(0,0,0,0.8)"; + ctx.fillRect(0, height / 2 - 20, width / 2, 20); + ctx.fillStyle = "#FFF"; + ctx.font = "14px arial"; + ctx.fillText("new content", 5, height / 2 - 5); + ctx.restore(); + + dd.appendChild(canvasToDrawOn); + dd.appendChild(canvasToDrawFrom); + dd.appendChild(canvasToDrawResult); + + dl.appendChild(dd); + } +} +``` + +#### Utility functions + +The program relies on a number of utility functions. + +```js +const lightMix = () => { + const ctx = canvas2.getContext("2d"); + ctx.save(); + ctx.globalCompositeOperation = "lighter"; + ctx.beginPath(); + ctx.fillStyle = "rgba(255,0,0,1)"; + ctx.arc(100, 200, 100, Math.PI * 2, 0, false); + ctx.fill(); + ctx.beginPath(); + ctx.fillStyle = "rgba(0,0,255,1)"; + ctx.arc(220, 200, 100, Math.PI * 2, 0, false); + ctx.fill(); + ctx.beginPath(); + ctx.fillStyle = "rgba(0,255,0,1)"; + ctx.arc(160, 100, 100, Math.PI * 2, 0, false); + ctx.fill(); + ctx.restore(); + ctx.beginPath(); + ctx.fillStyle = "#f00"; + ctx.fillRect(0, 0, 30, 30); + ctx.fill(); +}; +``` + +```js +const colorSphere = (element) => { + const ctx = canvas1.getContext("2d"); + const width = 360; + const halfWidth = width / 2; + const rotate = (1 / 360) * Math.PI * 2; // per degree + const offset = 0; // scrollbar offset + const oleft = -20; + const otop = -20; + for (let n = 0; n <= 359; n++) { + const gradient = ctx.createLinearGradient( + oleft + halfWidth, + otop, + oleft + halfWidth, + otop + halfWidth, + ); + const color = Color.HSV_RGB({ H: (n + 300) % 360, S: 100, V: 100 }); + gradient.addColorStop(0, "rgba(0,0,0,0)"); + gradient.addColorStop(0.7, `rgba(${color.R}, ${color.G}, ${color.B}, 1)`); + gradient.addColorStop(1, "rgba(255,255,255,1)"); + ctx.beginPath(); + ctx.moveTo(oleft + halfWidth, otop); + ctx.lineTo(oleft + halfWidth, otop + halfWidth); + ctx.lineTo(oleft + halfWidth + 6, otop); + ctx.fillStyle = gradient; + ctx.fill(); + ctx.translate(oleft + halfWidth, otop + halfWidth); + ctx.rotate(rotate); + ctx.translate(-(oleft + halfWidth), -(otop + halfWidth)); + } + ctx.beginPath(); + ctx.fillStyle = "#00f"; + ctx.fillRect(15, 15, 30, 30); + ctx.fill(); + return ctx.canvas; +}; +``` + +```js +// HSV (1978) = H: Hue / S: Saturation / V: Value +Color = {}; +Color.HSV_RGB = (o) => { + const S = o.S / 100; + let H = o.H / 360, + V = o.V / 100; + let R, G; + let A, B, C, D; + if (S === 0) { + R = G = B = Math.round(V * 255); + } else { + if (H >= 1) H = 0; + H *= 6; + D = H - Math.floor(H); + A = Math.round(255 * V * (1 - S)); + B = Math.round(255 * V * (1 - S * D)); + C = Math.round(255 * V * (1 - S * (1 - D))); + V = Math.round(255 * V); + switch (Math.floor(H)) { + case 0: + R = V; + G = C; + B = A; + break; + case 1: + R = B; + G = V; + B = A; + break; + case 2: + R = A; + G = V; + B = C; + break; + case 3: + R = A; + G = B; + B = V; + break; + case 4: + R = C; + G = A; + B = V; + break; + case 5: + R = V; + G = A; + B = B; + break; + } + } + return { R, G, B }; +}; + +const createInterlace = (size, color1, color2) => { + const proto = document.createElement("canvas").getContext("2d"); + proto.canvas.width = size * 2; + proto.canvas.height = size * 2; + proto.fillStyle = color1; // top-left + proto.fillRect(0, 0, size, size); + proto.fillStyle = color2; // top-right + proto.fillRect(size, 0, size, size); + proto.fillStyle = color2; // bottom-left + proto.fillRect(0, size, size, size); + proto.fillStyle = color1; // bottom-right + proto.fillRect(size, size, size, size); + const pattern = proto.createPattern(proto.canvas, "repeat"); + pattern.data = proto.canvas.toDataURL(); + return pattern; +}; + +const op_8x8 = createInterlace(8, "#FFF", "#eee"); +``` + +#### Result + +{{EmbedLiveSample("Demonstration of all values", "100%", 7250)}} + ## Specifications {{Specifications}} From 1608a85abb1d05dadc63f27c93fc3e4b7e630db0 Mon Sep 17 00:00:00 2001 From: Mike Lei Date: Fri, 20 Oct 2023 02:02:16 +0800 Subject: [PATCH 07/65] Fix invalid CSS property values in examples of `transition-duration` (#29731) --- files/en-us/web/css/transition-duration/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/en-us/web/css/transition-duration/index.md b/files/en-us/web/css/transition-duration/index.md index 8ed7043f2a5decb..de4f8fbcd55016e 100644 --- a/files/en-us/web/css/transition-duration/index.md +++ b/files/en-us/web/css/transition-duration/index.md @@ -70,7 +70,7 @@ transition-duration: unset; height: 100px; background-color: red; font-size: 18px; - transition-property: background-color font-size transform color; + transition-property: background-color, font-size, transform, color; transition-timing-function: ease-in-out; } @@ -79,7 +79,7 @@ transition-duration: unset; background-color: blue; color: yellow; font-size: 12px; - transition-property: background-color font-size transform color; + transition-property: background-color, font-size, transform, color; transition-timing-function: ease-in-out; } From 208faf7c7a86c73359d0ee9e026e33f93ede3c4c Mon Sep 17 00:00:00 2001 From: Dave Letorey Date: Thu, 19 Oct 2023 21:10:34 +0100 Subject: [PATCH 08/65] 29308 css length units in svg (#29599) * added example of using dynamic viewport lengths * added a resizable example * removed the linting from the dynamic viewport example * added the release note for svg length units * added more specific release note * Update files/en-us/web/svg/element/svg/index.md Co-authored-by: Zach Fox * Update files/en-us/mozilla/firefox/releases/119/index.md Co-authored-by: Zach Fox * Update files/en-us/web/svg/element/svg/index.md Co-authored-by: Zach Fox * Update files/en-us/web/svg/element/svg/index.md Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * updated the release note for svg attributes length values * added example into release note * Update files/en-us/mozilla/firefox/releases/119/index.md Co-authored-by: Zach Fox --------- Co-authored-by: Zach Fox Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../mozilla/firefox/releases/119/index.md | 2 + files/en-us/web/svg/element/svg/index.md | 55 ++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/files/en-us/mozilla/firefox/releases/119/index.md b/files/en-us/mozilla/firefox/releases/119/index.md index fdf9776621774e1..fdfc686e4a7e39a 100644 --- a/files/en-us/mozilla/firefox/releases/119/index.md +++ b/files/en-us/mozilla/firefox/releases/119/index.md @@ -34,6 +34,8 @@ This article provides information about the changes in Firefox 119 that affect d ### SVG +- The [SVG attributes](/en-US/docs/Web/SVG/Attribute) that accept a [``](/en-US/docs/Web/SVG/Content_type#length) value now support [level 3](https://www.w3.org/TR/css-values-3/#lengths) [length](/en-US/docs/Web/CSS/length) [CSS data types](/en-US/docs/Web/CSS/CSS_Types) for all SVG elements. This enables the sizing of SVG elements based on font sizes (`cap`, `rem`, etc.), viewport (`vh`, `vw`, `vmin`, etc.), or absolute lengths (`px`, `cm`, etc.), e.g. ``. (See [Firefox bug 1287054](https://bugzil.la/1287054) for more details). + #### Removals ### HTTP diff --git a/files/en-us/web/svg/element/svg/index.md b/files/en-us/web/svg/element/svg/index.md index 379d78c338e1875..e6605059d9d6665 100644 --- a/files/en-us/web/svg/element/svg/index.md +++ b/files/en-us/web/svg/element/svg/index.md @@ -11,7 +11,11 @@ The `svg` element is a container that defines a new coordinate system and [viewp > **Note:** The `xmlns` attribute is only required on the outermost `svg` element of _SVG documents_, or inside HTML documents with XML serialization. It is unnecessary for inner `svg` elements or inside HTML documents with HTML serialization. -## Example +## Examples + +### Nested `svg` element + +This example shows that nested `svg` elements do not need the `xmlns` attribute. ```css hidden html, @@ -36,7 +40,54 @@ svg { ``` -{{EmbedLiveSample('Example', 300, 100)}} +{{EmbedLiveSample('nested_svg-elements', 300, 100)}} + +### Using dynamic viewport units + +In this example, the `height` and `width` attributes on the `svg` element are set using the dynamic viewport value `60vmin`, equivalent to 60% of the viewport's width or height, whichever is smaller. + +```html hidden +
+ +
+``` + +```css hidden +.resizer { + display: flex; + margin: 1rem; + padding: 0; + resize: both; + overflow: hidden; + border: 5px dotted red; + height: 400px; +} +.resizer > .resized { + flex-grow: 1; + margin: 0; + padding: 0; + border: 0; +} +``` + +{{EmbedLiveSample('using_dynamic_viewport_lengths', '100%', 500)}} + +To change the iframe's dimensions try resizing the dotted red border from bottom right corner. ## Attributes From ec38a174fcbceb582a85bde1c09f5975f9094a29 Mon Sep 17 00:00:00 2001 From: Tom Adler Date: Thu, 19 Oct 2023 23:15:34 +0200 Subject: [PATCH 09/65] Update tag omission for HTMLPElement (#29725) * Update tag omission for HTMLPElement * Update files/en-us/web/html/element/p/index.md Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- files/en-us/web/html/element/p/index.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/files/en-us/web/html/element/p/index.md b/files/en-us/web/html/element/p/index.md index 295705fecbfa777..37627b8bc887af4 100644 --- a/files/en-us/web/html/element/p/index.md +++ b/files/en-us/web/html/element/p/index.md @@ -42,19 +42,23 @@ Paragraphs are [block-level elements](/en-US/docs/Glossary/Block-level_content), {{HTMLElement("p")}} element is immediately followed by an {{HTMLElement("address")}}, {{HTMLElement("article")}}, {{HTMLElement("aside")}}, - {{HTMLElement("blockquote")}}, {{HTMLElement("div")}}, + {{HTMLElement("blockquote")}}, {{HTMLElement("details")}}, {{HTMLElement("div")}}, {{HTMLElement("dl")}}, {{HTMLElement("fieldset")}}, + {{HTMLElement("figcaption")}}, {{HTMLElement("figure")}}, {{HTMLElement("footer")}}, {{HTMLElement("form")}}, {{HTMLElement("Heading_Elements", "h1")}}, {{HTMLElement("Heading_Elements", "h2")}}, {{HTMLElement("Heading_Elements", "h3")}}, {{HTMLElement("Heading_Elements", "h4")}}, {{HTMLElement("Heading_Elements", "h5")}}, {{HTMLElement("Heading_Elements", "h6")}}, - {{HTMLElement("header")}}, {{HTMLElement("hr")}}, - {{HTMLElement("menu")}}, {{HTMLElement("nav")}}, - {{HTMLElement("ol")}}, {{HTMLElement("pre")}}, + {{HTMLElement("header")}}, {{HTMLElement("hgroup")}}, {{HTMLElement("hr")}}, + {{HTMLElement("main")}}, {{HTMLElement("menu")}}, {{HTMLElement("nav")}}, + {{HTMLElement("ol")}}, {{HTMLElement("pre")}}, {{HTMLElement("search")}}, {{HTMLElement("section")}}, {{HTMLElement("table")}}, {{HTMLElement("ul")}} or another {{HTMLElement("p")}} element, or if there is no more content in the parent element and the - parent element is not an {{HTMLElement("a")}} element. + parent element is not an {{HTMLElement("a")}}, {{HTMLElement("audio")}}, + {{HTMLElement("del")}}, {{HTMLElement("ins")}}, {{HTMLElement("map")}}, + {{HTMLElement("noscript")}} or {{HTMLElement("video")}} element, + or an autonomous custom element. From fe42255a04894544259d1a4faed281bb26f921e0 Mon Sep 17 00:00:00 2001 From: webdev4422 Date: Fri, 20 Oct 2023 02:30:11 +0300 Subject: [PATCH 10/65] Fix uppercase PopupInfo class name (#29734) When call customElements.define('popup-info', PopupInfo) got error: "Uncaught ReferenceError: PopupInfo is not defined", because class name declared as "PopUpInfo", even in other places it's declared correctly. --- .../web/api/web_components/using_custom_elements/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/en-us/web/api/web_components/using_custom_elements/index.md b/files/en-us/web/api/web_components/using_custom_elements/index.md index bdda45f4a9466f5..ed2330b3cfc1bd8 100644 --- a/files/en-us/web/api/web_components/using_custom_elements/index.md +++ b/files/en-us/web/api/web_components/using_custom_elements/index.md @@ -190,7 +190,7 @@ To begin with, the JavaScript file defines a class called `PopupInfo`, which ext ```js // Create a class for the element -class PopUpInfo extends HTMLElement { +class PopupInfo extends HTMLElement { constructor() { // Always call super first in constructor super(); @@ -302,7 +302,7 @@ Here's the class definition: ```js // Create a class for the element -class PopUpInfo extends HTMLElement { +class PopupInfo extends HTMLElement { constructor() { // Always call super first in constructor super(); From aa1873fc373e882c6332e707221db344f5020e25 Mon Sep 17 00:00:00 2001 From: Ggg6542 <465806+gusega@users.noreply.github.com> Date: Fri, 20 Oct 2023 02:19:16 +0200 Subject: [PATCH 11/65] Update index.md (#29735) It does not matter if the callback function returns a Promise or not. The point is that one of the callback functions may be safely omitted in the chain. --- .../web/javascript/reference/global_objects/promise/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/javascript/reference/global_objects/promise/index.md b/files/en-us/web/javascript/reference/global_objects/promise/index.md index 553b1cf21cb1acd..1097d69f8af411c 100644 --- a/files/en-us/web/javascript/reference/global_objects/promise/index.md +++ b/files/en-us/web/javascript/reference/global_objects/promise/index.md @@ -63,7 +63,7 @@ myPromise .then(handleFulfilledC, handleRejectedC); ``` -Processing continues to the next link of the chain even when a `.then()` lacks a callback function that returns a Promise object. Therefore, a chain can safely omit every _rejection_ callback function until the final `.catch()`. +Processing continues to the next link of the chain even when a `.then()` lacks a callback function. Therefore, a chain can safely omit every _rejection_ callback function until the final `.catch()`. Handling a rejected promise in each `.then()` has consequences further down the promise chain. Sometimes there is no choice, because an error must be handled immediately. In such cases we must throw an error of some type to maintain error state down the chain. On the other hand, in the absence of an immediate need, it is simpler to leave out error handling until a final `.catch()` statement. A `.catch()` is really just a `.then()` without a slot for a callback function for the case when the promise is fulfilled. From 51e08ff1dec6fa5c6cd9d85a2417c84d694c870c Mon Sep 17 00:00:00 2001 From: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> Date: Fri, 20 Oct 2023 08:24:24 +0800 Subject: [PATCH 12/65] Update `DataTransferItem.webkitGetAsEntry()` Specifications section (#29496) * Update index.md * Update index.md * Update index.md --- files/en-us/web/api/datatransferitem/webkitgetasentry/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/api/datatransferitem/webkitgetasentry/index.md b/files/en-us/web/api/datatransferitem/webkitgetasentry/index.md index e4a161544e8678c..2042f4ea67db48a 100644 --- a/files/en-us/web/api/datatransferitem/webkitgetasentry/index.md +++ b/files/en-us/web/api/datatransferitem/webkitgetasentry/index.md @@ -181,7 +181,7 @@ You can see how this works by trying it out below. Find some files and directori ## Specifications -This API has no official W3C or WHATWG specification. +{{Specifications}} ## Browser compatibility From 5517a91488dd86bc2aa6010001a9a9a00953d8f2 Mon Sep 17 00:00:00 2001 From: Brian Michael Poblete Date: Thu, 19 Oct 2023 20:31:39 -0400 Subject: [PATCH 13/65] Correcting technical summary table for (#28602) * Correcting technical summary table for * add back html spec in spec-urls * fix bad frontmatter syntax * removed unnecessary tag * Update files/en-us/web/html/element/summary/index.md * Update files/en-us/web/html/element/summary/index.md --------- Co-authored-by: Estelle Weyl --- files/en-us/web/html/element/summary/index.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/files/en-us/web/html/element/summary/index.md b/files/en-us/web/html/element/summary/index.md index ddafdc49a00fe5c..73910b5a4f4cbdc 100644 --- a/files/en-us/web/html/element/summary/index.md +++ b/files/en-us/web/html/element/summary/index.md @@ -126,13 +126,7 @@ This example adds some semantics to the `` element to indicate the labe Implicit ARIA role - - button - + No corresponding role Permitted ARIA roles From 82dda1f0f5e772750dafcff08af0c4ef03a083d4 Mon Sep 17 00:00:00 2001 From: Hakeem <65634467+Ahmed-Hakeem@users.noreply.github.com> Date: Thu, 19 Oct 2023 22:14:30 -0400 Subject: [PATCH 14/65] Add special case for literal object prototype value (#29544) * Add special case for literal object prototype value * Update index.md * Update files/en-us/web/javascript/reference/global_objects/object/proto/index.md --------- Co-authored-by: Joshua Chen --- .../javascript/reference/global_objects/object/proto/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/javascript/reference/global_objects/object/proto/index.md b/files/en-us/web/javascript/reference/global_objects/object/proto/index.md index e43a5528ed231e3..263d08a8d19364d 100644 --- a/files/en-us/web/javascript/reference/global_objects/object/proto/index.md +++ b/files/en-us/web/javascript/reference/global_objects/object/proto/index.md @@ -34,7 +34,7 @@ If used as a getter, returns the object's `[[Prototype]]`. ## Description -The `__proto__` getter function exposes the value of the internal `[[Prototype]]` of an object. For objects created using an object literal, this value is `Object.prototype`. For objects created using array literals, this value is [`Array.prototype`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array). For functions, this value is {{jsxref("Function.prototype")}}. You can read more about the prototype chain in [Inheritance and the prototype chain](/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain). +The `__proto__` getter function exposes the value of the internal `[[Prototype]]` of an object. For objects created using an object literal (unless you use the [prototype setter](/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#prototype_setter) syntax), this value is `Object.prototype`. For objects created using array literals, this value is [`Array.prototype`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array). For functions, this value is {{jsxref("Function.prototype")}}. You can read more about the prototype chain in [Inheritance and the prototype chain](/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain). The `__proto__` setter allows the `[[Prototype]]` of an object to be mutated. The value provided must be an object or {{jsxref("Operators/null", "null")}}. Providing any other value will do nothing. From 0f89e17e8f7da8a67c76c59e7f3c5dbdd5f62de1 Mon Sep 17 00:00:00 2001 From: Per Nyblom Date: Fri, 20 Oct 2023 08:17:36 +0200 Subject: [PATCH 15/65] Added await to get processor node (#29658) If the await is not there, then newProcessorNode is a Promise and checking for null (as suggested in the below comments) will not detect if something went wrong. --- files/en-us/web/api/web_audio_api/using_audioworklet/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/api/web_audio_api/using_audioworklet/index.md b/files/en-us/web/api/web_audio_api/using_audioworklet/index.md index 196978f57c5a8ef..ef66d812d7b79a3 100644 --- a/files/en-us/web/api/web_audio_api/using_audioworklet/index.md +++ b/files/en-us/web/api/web_audio_api/using_audioworklet/index.md @@ -207,7 +207,7 @@ In order to ensure the context is usable, this starts by creating the context if You can then create a new audio processor node by doing this: ```js -let newProcessorNode = createMyAudioProcessor(); +let newProcessorNode = await createMyAudioProcessor(); ``` If the returned value, `newProcessorNode`, is non-`null`, we have a valid audio context with its hiss processor node in place and ready to use. From 37713c0c974d024ae6f695f9ae6bc7e26076ee3b Mon Sep 17 00:00:00 2001 From: Waldir Pimenta Date: Fri, 20 Oct 2023 15:18:14 +0100 Subject: [PATCH 16/65] Link navigator.language and Intl (#29347) --- .../en-us/web/api/navigator/language/index.md | 22 +++++++++---------- .../web/api/navigator/languages/index.md | 13 +++++++++++ .../reference/global_objects/intl/index.md | 20 +++++++++++++++++ 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/files/en-us/web/api/navigator/language/index.md b/files/en-us/web/api/navigator/language/index.md index 8a6943adb66daa5..5d45591e19301b0 100644 --- a/files/en-us/web/api/navigator/language/index.md +++ b/files/en-us/web/api/navigator/language/index.md @@ -8,25 +8,24 @@ browser-compat: api.Navigator.language {{APIRef("HTML DOM")}} -The **`Navigator.language`** read-only property returns -a string representing the preferred language of the user, usually the language of the -browser UI. +The **`Navigator.language`** read-only property returns a string representing the preferred language of the user, usually the language of the browser UI. ## Value -A string representing the -language version as defined in {{RFC(5646, "Tags for Identifying Languages (also known as BCP 47)")}}. Examples of valid language -codes include "en", "en-US", "fr", "fr-FR", "es-ES", etc. +A string representing the language version as defined in {{RFC(5646, "Tags for Identifying Languages (also known as BCP 47)")}}. Examples of valid language codes include "en", "en-US", "fr", "fr-FR", "es-ES", etc. -Note that in Safari on iOS prior to 10.2, the country code returned is lowercase: -"en-us", "fr-fr" etc. +Note that in Safari on iOS prior to 10.2, the country code returned is lowercase: "en-us", "fr-fr" etc. ## Examples +### Using Intl constructors to do language-specific formatting + +The {{jsxref("Intl")}} constructors allow formatting content to match the rules of a given locale. You can pass `navigator.language` to them to format content in the locale corresponding to the user's preferred language: + ```js -if (/^en\b/.test(navigator.language)) { - doLangSelect(window.navigator.language); -} +const date = new Date("2012-05-24"); + +const formattedDate = new Intl.DateTimeFormat(navigator.language).format(date); ``` ## Specifications @@ -41,3 +40,4 @@ if (/^en\b/.test(navigator.language)) { - {{domxref("navigator.languages")}} - {{domxref("navigator")}} +- {{jsxref("Intl")}} diff --git a/files/en-us/web/api/navigator/languages/index.md b/files/en-us/web/api/navigator/languages/index.md index 384e4941c0c5692..0795fab0312a7b7 100644 --- a/files/en-us/web/api/navigator/languages/index.md +++ b/files/en-us/web/api/navigator/languages/index.md @@ -30,11 +30,23 @@ A string. ## Examples +### Listing the contents of navigator.language and navigator.languages + ```js navigator.language; //"en-US" navigator.languages; //["en-US", "zh-CN", "ja-JP"] ``` +### Using Intl constructors to do language-specific formatting, with fallback + +The array of language identifiers contained in `navigator.languages` can be passed directly to the {{jsxref("Intl")}} constructors to implement preference-based fallback selection of locales, where the first entry in the list that matches a locale supported by `Intl` is used: + +```js +const date = new Date("2012-05-24"); + +const formattedDate = new Intl.DateTimeFormat(navigator.languages).format(date); +``` + ## Specifications {{Specifications}} @@ -48,3 +60,4 @@ navigator.languages; //["en-US", "zh-CN", "ja-JP"] - {{domxref("navigator.language")}} - {{domxref("navigator")}} - {{domxref("Window.languagechange_event", "languagechange")}} event +- {{jsxref("Intl")}} diff --git a/files/en-us/web/javascript/reference/global_objects/intl/index.md b/files/en-us/web/javascript/reference/global_objects/intl/index.md index dda1ab2241b250c..b65f9c0b50bfb92 100644 --- a/files/en-us/web/javascript/reference/global_objects/intl/index.md +++ b/files/en-us/web/javascript/reference/global_objects/intl/index.md @@ -123,6 +123,24 @@ log("en-US"); // 5/24/2012 26,254.39 log("de-DE"); // 24.5.2012 26.254,39 ``` +### Using the browser's preferred language + +Instead of passing a hardcoded locale name to the `Intl` methods, you can use the user's preferred language provided by {{domxref("navigator.language")}}: + +```js +const date = new Date("2012-05-24"); + +const formattedDate = new Intl.DateTimeFormat(navigator.language).format(date); +``` + +Alternatively, the {{domxref("navigator.languages")}} property provides a sorted list of the user's preferred languages. This list can be passed directly to the `Intl` constructors to implement preference-based fallback selection of locales. The [locale negotiation](#locale_identification_and_negotiation) process is used to pick the most appropriate locale available: + +```js +const count = 26254.39; + +const formattedCount = new Intl.NumberFormat(navigator.languages).format(count); +``` + ## Specifications {{Specifications}} @@ -138,4 +156,6 @@ log("de-DE"); // 24.5.2012 26.254,39 - {{jsxref("Date.prototype.toLocaleString()")}} - {{jsxref("Date.prototype.toLocaleDateString()")}} - {{jsxref("Date.prototype.toLocaleTimeString()")}} +- {{domxref("navigator.language")}} +- {{domxref("navigator.languages")}} - [The ECMAScript Internationalization API](https://norbertlindenberg.com/2012/12/ecmascript-internationalization-api/index.html) by Norbert Lindenberg (2012) From e6952e23af7bfef9ff4bf5448fdd0ae9bb80e653 Mon Sep 17 00:00:00 2001 From: Dev-Siri <102754004+Dev-Siri@users.noreply.github.com> Date: Sat, 21 Oct 2023 06:06:22 +0530 Subject: [PATCH 17/65] Change snake case to camel case for code examples in en-us/web/api/html_drag_and_drop_api/index.md (#29385) * Change from snake case to camel case in web/api/html_drag_and_drop_api/index.md * Fix the formatting issues --- .../web/api/html_drag_and_drop_api/index.md | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/files/en-us/web/api/html_drag_and_drop_api/index.md b/files/en-us/web/api/html_drag_and_drop_api/index.md index a283802f37af7d6..6d6db32823fd061 100644 --- a/files/en-us/web/api/html_drag_and_drop_api/index.md +++ b/files/en-us/web/api/html_drag_and_drop_api/index.md @@ -47,7 +47,7 @@ Making an element _draggable_ requires adding the [`draggable`](/en-US/docs/Web/ ```html @@ -75,7 +75,7 @@ The application is free to include any number of data items in a drag operation. Each {{domxref("DragEvent","drag event")}} has a {{domxref("DragEvent.dataTransfer","dataTransfer")}} property that _holds_ the event's data. This property (which is a {{domxref("DataTransfer")}} object) also has methods to _manage_ drag data. The {{domxref("DataTransfer.setData","setData()")}} method is used to add an item to the drag data, as shown in the following example. ```js -function dragstart_handler(ev) { +function dragstartHandler(ev) { // Add different types of drag data ev.dataTransfer.setData("text/plain", ev.target.innerText); ev.dataTransfer.setData("text/html", ev.target.outerHTML); @@ -99,7 +99,7 @@ By default, the browser supplies an image that appears beside the pointer during // will not be created and the default drag image will be used. let img = new Image(); img.src = "example.gif"; -function dragstart_handler(ev) { +function dragstartHandler(ev) { ev.dataTransfer.setDragImage(img, 10, 10); } ``` @@ -123,7 +123,7 @@ During the drag operation, drag effects may be modified to indicate that certain The following example shows how to use this property. ```js -function dragstart_handler(ev) { +function dragstartHandler(ev) { ev.dataTransfer.dropEffect = "copy"; } ``` @@ -140,11 +140,11 @@ The following example shows how to use those attributes, and includes basic even ```html -

+

Drop Zone

``` @@ -176,16 +173,16 @@ The following example shows a drop handler getting the source element's `id` fro ```html -

+

This element is draggable.

+ ondrop="dropHandler(event)" + ondragover="dragoverHandler(event)"> Drop Zone
``` From 52d6465a043b92ec9270e0dbd3935f0282329612 Mon Sep 17 00:00:00 2001 From: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> Date: Sat, 21 Oct 2023 08:56:29 +0800 Subject: [PATCH 18/65] Add missing `Client.frameType` property description in `Client` page (#29168) Update index.md Co-authored-by: wbamberg --- files/en-us/web/api/client/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/files/en-us/web/api/client/index.md b/files/en-us/web/api/client/index.md index 2bde6d41e935750..8e1a06ccab8a1d9 100644 --- a/files/en-us/web/api/client/index.md +++ b/files/en-us/web/api/client/index.md @@ -16,6 +16,8 @@ The `Client` interface represents an executable context such as a {{domxref("Wor ## Instance properties +- {{domxref("Client.frameType")}} {{ReadOnlyInline}} + - : The client's frame type as a string. It can be `"auxiliary"`, `"top-level"`, `"nested"`, or `"none"`. - {{domxref("Client.id")}} {{ReadOnlyInline}} - : The universally unique identifier of the client as a string. - {{domxref("Client.type")}} {{ReadOnlyInline}} From f3a30acc7626f5532ed195ec050c3db3156a75bb Mon Sep 17 00:00:00 2001 From: A1lo Date: Sat, 21 Oct 2023 10:34:28 +0800 Subject: [PATCH 19/65] fix a broken link to load event (#29739) * fix a broken link to load event * Update files/en-us/learn/html/howto/author_fast-loading_html_pages/index.md Co-authored-by: wbamberg --------- Co-authored-by: wbamberg --- .../learn/html/howto/author_fast-loading_html_pages/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/learn/html/howto/author_fast-loading_html_pages/index.md b/files/en-us/learn/html/howto/author_fast-loading_html_pages/index.md index e492bc562a9b90f..0f9d73375c9b9cd 100644 --- a/files/en-us/learn/html/howto/author_fast-loading_html_pages/index.md +++ b/files/en-us/learn/html/howto/author_fast-loading_html_pages/index.md @@ -135,7 +135,7 @@ and should specify widths of columns using the [``](/en-US/docs/Web/HTML/El ### Use lazy loading for images -By default, images are loaded **eagerly**; that is, the image is fetched and rendered as soon as it's processed in the HTML. All eagerly loaded images are rendered before the document's {{domxref("Document.load_event", "load")}} event is sent. Switching to lazy loading of images tells the browser to hold off on loading images until they're about to be needed to draw the {{Glossary("visual viewport")}}. +By default, images are loaded **eagerly**; that is, the image is fetched and rendered as soon as it's processed in the HTML. All eagerly loaded images are rendered before the window's [`load`](/en-US/docs/Web/API/Window/load_event) event is sent. Switching to lazy loading of images tells the browser to hold off on loading images until they're about to be needed to draw the {{Glossary("visual viewport")}}. To mark an image for lazy loading, specify its [`loading`](/en-US/docs/Web/HTML/Element/img#loading) attribute with a value of `lazy`. With this set, the image will only be loaded when it's needed. From 7870c4db8ad2eae109d1c7c68e038743115eebb5 Mon Sep 17 00:00:00 2001 From: A1lo Date: Sat, 21 Oct 2023 11:57:33 +0800 Subject: [PATCH 20/65] fix: replace the documentation of "tag" yaml header (#29750) --- .../howto/json_structured_data/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/files/en-us/mdn/writing_guidelines/howto/json_structured_data/index.md b/files/en-us/mdn/writing_guidelines/howto/json_structured_data/index.md index 2838963a9ea9b5e..04e406e1bdc6d4f 100644 --- a/files/en-us/mdn/writing_guidelines/howto/json_structured_data/index.md +++ b/files/en-us/mdn/writing_guidelines/howto/json_structured_data/index.md @@ -56,20 +56,20 @@ An entry in `GroupData.json` has the following structure: - : This key is both an ID used by sidebar macros like `\{{APIRef("Name_of_the_API")}}` and the name displayed in the sidebar itself. Choose it wisely. > **Warning:** If you want to change the name displayed in the sidebar, you must edit all the pages displaying it. - `"overview"` - - : This is a list containing one page: the overview page, used as the link for the `"Name_of_the_API"` text. The value is the _title of the page_, and the page must be in the `web/api/`directory. + - : This is a list containing one page: the overview page, used as the link for the `"Name_of_the_API"` text. The value is the _title of the page_, and the page must be in the `web/api/` directory. - `"guides"` - : This is a list of guides to display in the sidebar, in the given order. The values are _paths to the page_, starting with `/docs/`. - `"interfaces"` - : This lists the interfaces that are part of the API. - `"methods"` - : This lists the methods that are part of the API. - > **Note:** The methods of the interfaces listed in `"interfaces"` **must** not be listed there. They are automatically added to the sidebar if the tag `Method` is in the YAML header on that page. + > **Note:** The methods of the interfaces listed in `"interfaces"` **must** not be listed there. They are automatically added to the sidebar if the `page-type` key for that page is `web-api-static-method` or `web-api-instance-method`. - `"properties"` - : This lists the methods on other interfaces that are part of the API, like `navigator.xr` (a property that the WebXR API adds to the `navigator` object) - > **Note:** The properties of the interfaces listed in `"interfaces"` **must** not be listed there. They are automatically added to the sidebar if the tag `Property` is in the YAML header on that page. + > **Note:** The properties of the interfaces listed in `"interfaces"` **must** not be listed there. They are automatically added to the sidebar if the `page-type` key for that page is `web-api-static-property` or `web-api-instance-property`. - `"events"` - : This lists events of other interfaces that are part of the API. The values are the _title of the pages_ (that must reside under `Web/Events`) - > **Note:** The events targeting the interfaces listed in `"interfaces"` **must** not be listed there. They are automatically added to the sidebar if the tag `Event` (singular!) is in the YAML header on that page. + > **Note:** The events targeting the interfaces listed in `"interfaces"` **must** not be listed there. They are automatically added to the sidebar if the `page-type` key for that page is `web-api-event`. There are two other keys, `"dictionaries"` and `"callbacks"`, operating on the same principle. As we no longer document these entities in their own pages, their use is deprecated, and no new entry should be added to them (and we remove them little by little). From 58269be5547b2e0b5b6f53a4c6eff6b13dfdf9bd Mon Sep 17 00:00:00 2001 From: Vidit Agrawal <52532308+viditagrawal56@users.noreply.github.com> Date: Sat, 21 Oct 2023 10:46:28 +0530 Subject: [PATCH 21/65] Fixes: #29726 changed return type to "boolean" for checkValidity() (#29747) --- files/en-us/web/api/htmlselectelement/checkvalidity/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/api/htmlselectelement/checkvalidity/index.md b/files/en-us/web/api/htmlselectelement/checkvalidity/index.md index 78a2df5a1be1fe1..77269499ad3a278 100644 --- a/files/en-us/web/api/htmlselectelement/checkvalidity/index.md +++ b/files/en-us/web/api/htmlselectelement/checkvalidity/index.md @@ -25,7 +25,7 @@ None. ### Return value -None ({{jsxref("undefined")}}). +Returns `true` if the value of the element has no validity problems; otherwise returns `false`. ## Specifications From b333e28a08926b35b9b35b3b5e59ebbdf76fa9ad Mon Sep 17 00:00:00 2001 From: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> Date: Sat, 21 Oct 2023 23:52:30 +0800 Subject: [PATCH 22/65] Add missing `WindowClient.ancestorOrigins` (#29465) * Update index.md * Create index.md * Update index.md * Update index.md * Update index.md * Update index.md * Update files/en-us/web/api/windowclient/ancestororigins/index.md * Update files/en-us/web/api/windowclient/index.md --------- Co-authored-by: wbamberg --- .../api/windowclient/ancestororigins/index.md | 25 +++++++++++++++++++ files/en-us/web/api/windowclient/index.md | 2 ++ 2 files changed, 27 insertions(+) create mode 100644 files/en-us/web/api/windowclient/ancestororigins/index.md diff --git a/files/en-us/web/api/windowclient/ancestororigins/index.md b/files/en-us/web/api/windowclient/ancestororigins/index.md new file mode 100644 index 000000000000000..006858cfa99b101 --- /dev/null +++ b/files/en-us/web/api/windowclient/ancestororigins/index.md @@ -0,0 +1,25 @@ +--- +title: "WindowClient: ancestorOrigins property" +short-title: ancestorOrigins +slug: Web/API/WindowClient/ancestorOrigins +page-type: web-api-instance-property +browser-compat: api.WindowClient.ancestorOrigins +--- + +{{APIRef("Service Workers API")}} + +The **`ancestorOrigins`** read-only property of the {{domxref("WindowClient")}} interface is an array of strings listing the origins of all ancestors of the browsing context represented by this `WindowClient` in reverse order. + +The first element in the array is the origin of this window's parent, and the last element is the origin of the top-level browsing context. If this window is itself a top-level browsing context, then `ancestorOrigins` is an empty array. + +## Value + +An array of strings. + +## Specifications + +{{Specifications}} + +## Browser compatibility + +{{Compat}} diff --git a/files/en-us/web/api/windowclient/index.md b/files/en-us/web/api/windowclient/index.md index 42a955f05ea4b8b..098bcc9b7448e20 100644 --- a/files/en-us/web/api/windowclient/index.md +++ b/files/en-us/web/api/windowclient/index.md @@ -24,6 +24,8 @@ _`WindowClient` inherits methods from its parent interface, {{domxref("Client")} _`WindowClient` inherits properties from its parent interface, {{domxref("Client")}}._ +- {{domxref("WindowClient.ancestorOrigins")}} {{ReadOnlyInline}} + - : An array of strings that indicates the ancestor origins of the browsing context represented by this `WindowClient` in reverse order. - {{domxref("WindowClient.focused")}} {{ReadOnlyInline}} - : A boolean that indicates whether the current client has focus. - {{domxref("WindowClient.visibilityState")}} {{ReadOnlyInline}} From 66b6d40a37daef8aa0013c44c310eeb2f0bcd7e1 Mon Sep 17 00:00:00 2001 From: Andreas Kluth Date: Sun, 22 Oct 2023 02:42:05 +0200 Subject: [PATCH 23/65] Fix misleading sample MyCustomizedElement vs. MyCustomizedBuiltInElement (#29763) * Fix misleading sample MyCustomizedElement vs. MyCustomizedBuiltInElement The sample code was not aligned. The sample class was not used when created this can be irritating to beginners. * Update files/en-us/web/api/customelementregistry/define/index.md Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Co-authored-by: wbamberg Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../web/api/customelementregistry/define/index.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/files/en-us/web/api/customelementregistry/define/index.md b/files/en-us/web/api/customelementregistry/define/index.md index 75a1d1627ea9978..a6d16d15393e617 100644 --- a/files/en-us/web/api/customelementregistry/define/index.md +++ b/files/en-us/web/api/customelementregistry/define/index.md @@ -123,15 +123,19 @@ This element extends the built-in {{htmlelement("p")}} element. In this minimal example the element doesn't implement any customization, so it will behave just like a normal `

` element. However, it does satisfy the requirements of `define()`, so we can define it like this: ```js -customElements.define("my-customized-element", MyCustomizedElement, { - extends: "p", -}); +customElements.define( + "my-customized-built-in-element", + MyCustomizedBuiltInElement, + { + extends: "p", + }, +); ``` We could then use it in an HTML page like this: ```html -

+

``` ## Specifications From f66cd2264cd95eda299cdd1a204b5c65ac41e501 Mon Sep 17 00:00:00 2001 From: authentictech Date: Sun, 22 Oct 2023 01:46:28 +0100 Subject: [PATCH 24/65] Update index.md (#29759) Links to a missing page at https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/tasks/conditionals/conditionals4-download.html It should instead link to https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/tasks/conditionals/conditionals3-download.html --- .../test_your_skills_colon__conditionals/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/learn/javascript/building_blocks/test_your_skills_colon__conditionals/index.md b/files/en-us/learn/javascript/building_blocks/test_your_skills_colon__conditionals/index.md index e7eae110a6e4437..56e85b773d422ff 100644 --- a/files/en-us/learn/javascript/building_blocks/test_your_skills_colon__conditionals/index.md +++ b/files/en-us/learn/javascript/building_blocks/test_your_skills_colon__conditionals/index.md @@ -79,7 +79,7 @@ Try updating the live code below to recreate the finished example: > **Callout:** > -> [Download the starting point for this task](https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/tasks/conditionals/conditionals4-download.html) to work in your own editor or in an online editor. +> [Download the starting point for this task](https://github.com/mdn/learning-area/blob/main/javascript/building-blocks/tasks/conditionals/conditionals3-download.html) to work in your own editor or in an online editor. ## Assessment or further help From 379635d7affec1cb94ddc636878a0b39cc5d3cd9 Mon Sep 17 00:00:00 2001 From: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> Date: Sun, 22 Oct 2023 18:36:33 +0800 Subject: [PATCH 25/65] Remove the {{InheritanceDiagram}} for FileSystemSyncAccessHandle interface (#29700) --- files/en-us/web/api/filesystemsyncaccesshandle/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/files/en-us/web/api/filesystemsyncaccesshandle/index.md b/files/en-us/web/api/filesystemsyncaccesshandle/index.md index aa1e458e0569619..67bf7f054ab05bb 100644 --- a/files/en-us/web/api/filesystemsyncaccesshandle/index.md +++ b/files/en-us/web/api/filesystemsyncaccesshandle/index.md @@ -15,8 +15,6 @@ As a result, its methods are not subject to the same security checks as methods The interface is accessed through the {{domxref('FileSystemFileHandle.createSyncAccessHandle()')}} method. -{{InheritanceDiagram}} - > **Note:** In earlier versions of the spec, {{domxref("FileSystemSyncAccessHandle.close()", "close()")}}, {{domxref("FileSystemSyncAccessHandle.flush()", "flush()")}}, {{domxref("FileSystemSyncAccessHandle.getSize()", "getSize()")}}, and {{domxref("FileSystemSyncAccessHandle.truncate()", "truncate()")}} were wrongly specified as asynchronous methods, and older versions of some browsers implement them in this way. However, all current browsers that support these methods implement them as synchronous methods. ## Instance properties From 43bcca82947c5bfada6bf37790ab7633e048dd2d Mon Sep 17 00:00:00 2001 From: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> Date: Sun, 22 Oct 2023 18:37:13 +0800 Subject: [PATCH 26/65] Update `Storage.setItem()` Exceptions section (#29758) --- files/en-us/web/api/storage/setitem/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/en-us/web/api/storage/setitem/index.md b/files/en-us/web/api/storage/setitem/index.md index c96bf60a5f17230..443f6160bf2f937 100644 --- a/files/en-us/web/api/storage/setitem/index.md +++ b/files/en-us/web/api/storage/setitem/index.md @@ -32,8 +32,8 @@ None ({{jsxref("undefined")}}). ### Exceptions -`setItem()` may throw an exception if the storage is full. Developers should make sure to -**always catch possible exceptions from `setItem()`**. +- `QuotaExceededError` {{domxref("DOMException")}} + - : Thrown if the storage run out of disk quota or the user declined to grant you more space. ## Examples From 8ea688bd431be14b0506f3964d12c226749f7da5 Mon Sep 17 00:00:00 2001 From: Vincent Hilla Date: Sun, 22 Oct 2023 19:36:24 +0200 Subject: [PATCH 27/65] Update RadioNodeList description to reflect this collections content better (#29105) * Update RadioNodeList description to reflect this collections content better See step 4 in `[namedItem(name)](https://html.spec.whatwg.org/#dom-htmlformcontrolscollection-nameditem)`. Despite the name, a `RadioNodeList` is a collection of elements with a specified `name` or `id`, but does not necessarily contain radio buttons. * Update files/en-us/web/api/radionodelist/index.md Co-authored-by: wbamberg --------- Co-authored-by: wbamberg --- files/en-us/web/api/radionodelist/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/api/radionodelist/index.md b/files/en-us/web/api/radionodelist/index.md index e2190f29f545c70..945ef66842bad4e 100644 --- a/files/en-us/web/api/radionodelist/index.md +++ b/files/en-us/web/api/radionodelist/index.md @@ -7,7 +7,7 @@ browser-compat: api.RadioNodeList {{APIRef("HTML DOM")}} -The **`RadioNodeList`** interface represents a collection of radio elements in a {{HTMLElement("form")}} or a {{HTMLElement("fieldset")}} element. +The **`RadioNodeList`** interface represents a collection of elements in a {{HTMLElement("form")}} or a {{HTMLElement("fieldset")}} element, returned by a call to {{domxref("HTMLFormControlsCollection.namedItem()")}}. {{InheritanceDiagram}} From 054a2cf2a394c5ec8a4ec1eb98a78ab77badb8e8 Mon Sep 17 00:00:00 2001 From: Shane Date: Mon, 23 Oct 2023 02:09:14 +0800 Subject: [PATCH 28/65] Add an example in the "Note" section of "Bound methods in classes" on `this` page (#29694) * Add an example in the "Note" section of "Bound methods in classes" on `this` page * Update files/en-us/web/javascript/reference/operators/this/index.md Co-authored-by: Joshua Chen * Update files/en-us/web/javascript/reference/operators/this/index.md --------- Co-authored-by: Joshua Chen --- files/en-us/web/javascript/reference/operators/this/index.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/files/en-us/web/javascript/reference/operators/this/index.md b/files/en-us/web/javascript/reference/operators/this/index.md index 137cfccb45e3868..a1c3cc41757f74e 100644 --- a/files/en-us/web/javascript/reference/operators/this/index.md +++ b/files/en-us/web/javascript/reference/operators/this/index.md @@ -502,6 +502,11 @@ bird.sayBye(); // Bye from Ferrari ``` > **Note:** Classes are always in strict mode. Calling methods with an undefined `this` will throw an error if the method tries to access properties on `this`. +> +> ```js example-bad +> const carSayHi = car.sayHi; +> carSayHi(); // TypeError because the 'sayHi' method tries to access 'this.name', but 'this' is undefined in strict mode. +> ``` Note, however, that auto-bound methods suffer from the same problem as [using arrow functions for class properties](/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#cannot_be_used_as_methods): each instance of the class will have its own copy of the method, which increases memory usage. Only use it where absolutely necessary. You can also mimic the implementation of [`Intl.NumberFormat.prototype.format()`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/format#using_format_with_map): define the property as a getter that returns a bound function when accessed and saves it, so that the function is only created once and only created when necessary. From 9e82c37fd11e83ac75219963db70e81a23cbe56a Mon Sep 17 00:00:00 2001 From: wbamberg Date: Sun, 22 Oct 2023 20:19:48 -0700 Subject: [PATCH 29/65] Better example for namedItem() (#29753) --- .../nameditem/index.md | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/files/en-us/web/api/htmlformcontrolscollection/nameditem/index.md b/files/en-us/web/api/htmlformcontrolscollection/nameditem/index.md index d9d680b33a42ee6..29650074fc7805f 100644 --- a/files/en-us/web/api/htmlformcontrolscollection/nameditem/index.md +++ b/files/en-us/web/api/htmlformcontrolscollection/nameditem/index.md @@ -21,36 +21,60 @@ equivalent to `collection.namedItem("value")`. ## Syntax ```js-nolint -namedItem(str) -// or collection[str] +namedItem(name) +[name] ``` ### Parameters -- `str` is a string +- `name` + - : A string which will be used to match against the `name` or `id` attributes of the controls in this `HTMLFormControlsCollection` object. ### Return value -- `item` is a {{domxref("RadioNodeList")}}, {{domxref("Element")}}, or - [`null`](/en-US/docs/Web/JavaScript/Reference/Operators/null). +- A {{domxref("RadioNodeList")}}, {{domxref("Element")}}, or [`null`](/en-US/docs/Web/JavaScript/Reference/Operators/null). ## Examples -### HTML +### Using namedItem() + +#### HTML ```html
- + + + + +
+ +
``` -### JavaScript +```css hidden +div { + margin: 1rem 0; +} +``` + +#### JavaScript ```js -// Returns the HTMLInputElement representing #my-form-control -elem1 = document.forms[0]["my-form-control"]; +const form = document.querySelector("form"); +const items = form.elements.namedItem("my-form-control"); + +const output = document.querySelector("#output"); +const itemIDs = Array.from(items) + .map((item) => `"${item.id}"`) + .join(", "); +output.textContent = `My items: ${itemIDs}`; ``` +#### Result + +{{EmbedLiveSample("Using namedItem()")}} + ## Specifications {{Specifications}} From 5b036c58189822553d3fe864f90ebb7781c82ea2 Mon Sep 17 00:00:00 2001 From: Taemin Hong Date: Mon, 23 Oct 2023 12:43:45 +0900 Subject: [PATCH 30/65] WebGL: Fix description of vertexAttrib (#29772) --- .../web/api/webglrenderingcontext/vertexattrib/index.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/files/en-us/web/api/webglrenderingcontext/vertexattrib/index.md b/files/en-us/web/api/webglrenderingcontext/vertexattrib/index.md index 9800bba3da6d160..f72b8bdb63ef973 100644 --- a/files/en-us/web/api/webglrenderingcontext/vertexattrib/index.md +++ b/files/en-us/web/api/webglrenderingcontext/vertexattrib/index.md @@ -57,9 +57,8 @@ This value will be used if a bound array buffer has not been enabled with Attributes may be matrices, in which case columns of the matrix must be loaded into successive vertex attribute slots. -The values set with {{domxref("WebGLRenderingContext.vertexAttribPointer()", - "vertexAttribPointer")}} are context-global, i.e. they aren't part of the shader state -(like generix vertex attribute indexes to shader variable bindings) and aren't part of +The values set with `vertexAttrib` are context-global; that is, they aren't part of the shader state +(like generic vertex attribute indexes to shader variable bindings) and aren't part of the vertex array object state (like enabled vertex attribute arrays). The only way to change the values is by calling this function again. From b18116cfc8a5af2fb8f3fb350524fba1256644c5 Mon Sep 17 00:00:00 2001 From: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> Date: Mon, 23 Oct 2023 13:57:01 +0800 Subject: [PATCH 31/65] update BatteryManager for unsupport situation description (#29761) update --- files/en-us/web/api/batterymanager/charging/index.md | 2 +- files/en-us/web/api/batterymanager/chargingtime/index.md | 6 +++--- .../en-us/web/api/batterymanager/dischargingtime/index.md | 7 ++----- files/en-us/web/api/batterymanager/level/index.md | 4 +--- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/files/en-us/web/api/batterymanager/charging/index.md b/files/en-us/web/api/batterymanager/charging/index.md index 42980902c77d47c..5eab574483e31b6 100644 --- a/files/en-us/web/api/batterymanager/charging/index.md +++ b/files/en-us/web/api/batterymanager/charging/index.md @@ -10,7 +10,7 @@ browser-compat: api.BatteryManager.charging The **`BatteryManager.charging`** property is a Boolean value indicating whether or not the device's battery is currently being charged. When its value changes, the [`chargingchange`](/en-US/docs/Web/API/BatteryManager/chargingchange_event) event is fired. -If the battery is charging, this value is `true`. Otherwise, it is `false`. +If the battery is charging or the user agent is unable to report the battery status information, this value is `true`. Otherwise, it is `false`. ## Value diff --git a/files/en-us/web/api/batterymanager/chargingtime/index.md b/files/en-us/web/api/batterymanager/chargingtime/index.md index 61ce789f8634d78..b24a29c0ca07081 100644 --- a/files/en-us/web/api/batterymanager/chargingtime/index.md +++ b/files/en-us/web/api/batterymanager/chargingtime/index.md @@ -8,9 +8,9 @@ browser-compat: api.BatteryManager.chargingTime {{APIRef("Battery API")}} -The **`BatteryManager.chargingTime`** property indicates the amount of time, in seconds, that remain until the battery is fully charged or `0` if the battery is already fully charged. If the battery is currently -discharging, its value is -[`Infinity`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity). When its value changes, the [`chargingtimechange`](/en-US/docs/Web/API/BatteryManager/chargingtimechange_event) event is fired. +The **`BatteryManager.chargingTime`** property indicates the amount of time, in seconds, that remain until the battery is fully charged or `0` if the battery is already fully charged or the user agent is unable to report the battery status information. +If the battery is currently discharging, its value is [`Infinity`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity). +When its value changes, the [`chargingtimechange`](/en-US/docs/Web/API/BatteryManager/chargingtimechange_event) event is fired. > **Note:** Even if the time returned is precise to the second, > browsers round them to a higher interval diff --git a/files/en-us/web/api/batterymanager/dischargingtime/index.md b/files/en-us/web/api/batterymanager/dischargingtime/index.md index 011eacb5e1a136f..373b2a339d19e74 100644 --- a/files/en-us/web/api/batterymanager/dischargingtime/index.md +++ b/files/en-us/web/api/batterymanager/dischargingtime/index.md @@ -8,11 +8,8 @@ browser-compat: api.BatteryManager.dischargingTime {{APIRef("Battery API")}} -The **`BatteryManager.dischargingTime`** property indicates the amount of time, in seconds, that remains until the battery is fully -discharged, -or [`Infinity`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity) -if the battery is currently charging rather than discharging, -or if the system is unable to report the remaining discharging time. +The **`BatteryManager.dischargingTime`** property indicates the amount of time, in seconds, that remains until the battery is fully discharged, +or [`Infinity`](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Infinity) if the battery is currently charging rather than discharging or the user agent is unable to report the battery status information. When its value changes, the [`dischargingtimechange`](/en-US/docs/Web/API/BatteryManager/dischargingtimechange_event) event is fired. > **Note:** Even if the time returned is precise to the second, browsers round them to a higher diff --git a/files/en-us/web/api/batterymanager/level/index.md b/files/en-us/web/api/batterymanager/level/index.md index 90fc2bee6ce9e75..efaef07ffe8bd1a 100644 --- a/files/en-us/web/api/batterymanager/level/index.md +++ b/files/en-us/web/api/batterymanager/level/index.md @@ -10,9 +10,7 @@ browser-compat: api.BatteryManager.level The **`BatteryManager.level`** property indicates the current battery charge level as a value between `0.0` and `1.0`. A value of `0.0` means the battery is empty and the system is about to be suspended. -A value of `1.0` means the battery is full. -A value of `1.0` is also returned if the implementation isn't able to determine the battery charge level -or if the system is not battery-powered. +A value of `1.0` means the battery is full or the user agent is unable to report the battery status information. When its value changes, the [`levelchange`](/en-US/docs/Web/API/BatteryManager/levelchange_event) event is fired. ## Value From aa9aa4edeef4f21d94c99303723b763893ee0e7e Mon Sep 17 00:00:00 2001 From: John Bafford Date: Mon, 23 Oct 2023 02:26:32 -0400 Subject: [PATCH 32/65] Fix typo in text_fragments/index.md (#29770) Removes an unnecessary (and ungrammatical) "you" from the description of the text fragments feature. --- files/en-us/web/text_fragments/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/en-us/web/text_fragments/index.md b/files/en-us/web/text_fragments/index.md index 1b7ed6e65a95818..804a27723a83999 100644 --- a/files/en-us/web/text_fragments/index.md +++ b/files/en-us/web/text_fragments/index.md @@ -8,7 +8,7 @@ browser-compat: - css.selectors.target-text --- -**Text fragments** allow you linking directly to a specific portion of text in a web document, without requiring the author to annotate it with an ID, using particular syntax in the URL fragment. Supporting browsers are free to choose how to draw attention to the linked text, e.g. with a color highlight and/or scrolling to the content on the page. This is useful because it allows web content authors to deep-link to other content they don't control, without relying on the presence of IDs to make that possible. Building on top of that, it could be used to generate more effective content-sharing links for users to pass to one another. +**Text fragments** allow linking directly to a specific portion of text in a web document, without requiring the author to annotate it with an ID, using particular syntax in the URL fragment. Supporting browsers are free to choose how to draw attention to the linked text, e.g. with a color highlight and/or scrolling to the content on the page. This is useful because it allows web content authors to deep-link to other content they don't control, without relying on the presence of IDs to make that possible. Building on top of that, it could be used to generate more effective content-sharing links for users to pass to one another. ## Concepts and usage From ba613b129ef24249708c5e47a6dc37eea8027663 Mon Sep 17 00:00:00 2001 From: skyclouds2001 <95597335+skyclouds2001@users.noreply.github.com> Date: Mon, 23 Oct 2023 15:13:13 +0800 Subject: [PATCH 33/65] Remove the incorrect event of Worker interface (#29773) --- files/en-us/web/api/worker/index.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/files/en-us/web/api/worker/index.md b/files/en-us/web/api/worker/index.md index 5872b804713db62..c74db38af8bfcbe 100644 --- a/files/en-us/web/api/worker/index.md +++ b/files/en-us/web/api/worker/index.md @@ -43,10 +43,6 @@ _Inherits methods from its parent, {{domxref("EventTarget")}}._ - : Fires when the worker's parent receives a message from that worker. - [`messageerror`](/en-US/docs/Web/API/Worker/messageerror_event) - : Fires when a `Worker` object receives a message that can't be [deserialized](/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm). -- [`rejectionhandled`](/en-US/docs/Web/API/Window/rejectionhandled_event) - - : Fires every time a {{jsxref("Promise")}} rejects, regardless of whether or not there is a handler to catch the rejection. -- [`unhandledrejection`](/en-US/docs/Web/API/Window/unhandledrejection_event) - - : Fires when a {{jsxref("Promise")}} rejects with no handler to catch the rejection. ## Example From c64e813d8ab9dbe22cbc049c26f7c6703370a2b7 Mon Sep 17 00:00:00 2001 From: Brian Thomas Smith Date: Mon, 23 Oct 2023 10:57:58 +0200 Subject: [PATCH 34/65] chore(learn): add details about grading tasks (#29139) * docs(learn): update notes for assessments in Learn area * docs(learn): update notes for assessments in Learn area * docs(learn): update notes for assessments in Learn area * docs(learn): communication channels edits, community page tidy up * docs(learn): communication channels edits, community page tidy up * Apply suggestions from code review Co-authored-by: Hamish Willee * docs(learn): replace prev/next macros deleted by accident * docs(learn): remove links to MDN Playground in Learn area * docs(learn): minor change to sentence case --------- Co-authored-by: Hamish Willee --- .../accessibility_troubleshooting/index.md | 16 +---- .../index.md | 18 +----- .../index.md | 18 +----- .../test_your_skills_colon__wai-aria/index.md | 18 +----- .../a_cool_looking_box/index.md | 17 +----- .../building_blocks/box_model_tasks/index.md | 18 +----- .../building_blocks/cascade_tasks/index.md | 18 +----- .../index.md | 17 +----- .../fundamental_css_comprehension/index.md | 17 +----- .../css/building_blocks/images_tasks/index.md | 18 +----- .../building_blocks/overflow_tasks/index.md | 18 +----- .../selectors/selectors_tasks/index.md | 18 +----- .../css/building_blocks/sizing_tasks/index.md | 18 +----- .../css/building_blocks/tables_tasks/index.md | 18 +----- .../index.md | 18 +----- .../css/building_blocks/values_tasks/index.md | 18 +----- .../writing_modes_tasks/index.md | 18 +----- .../css/css_layout/flexbox_skills/index.md | 18 +----- .../css/css_layout/floats_skills/index.md | 18 +----- .../fundamental_layout_comprehension/index.md | 17 +----- .../learn/css/css_layout/grid_skills/index.md | 18 +----- .../css/css_layout/multicol_skills/index.md | 18 +----- .../css/css_layout/position_skills/index.md | 18 +----- .../learn/css/css_layout/rwd_skills/index.md | 17 +----- .../styling_a_biography_page/index.md | 18 +----- .../typesetting_a_homepage/index.md | 17 +----- .../index.md | 18 +----- .../index.md | 18 +----- .../index.md | 18 +----- .../index.md | 18 +----- .../index.md | 18 +----- .../index.md | 18 +----- .../index.md | 18 +----- .../marking_up_a_letter/index.md | 17 +----- .../structuring_a_page_of_content/index.md | 16 +---- .../index.md | 18 +----- .../index.md | 18 +----- .../test_your_skills_colon__links/index.md | 18 +----- .../index.md | 18 +----- .../mozilla_splash_page/index.md | 16 +---- .../index.md | 18 +----- .../tables/structuring_planet_data/index.md | 18 +----- files/en-us/learn/index.md | 22 ++++++- .../sequencing_animations/index.md | 14 +---- .../building_blocks/events/index.md | 2 +- .../building_blocks/image_gallery/index.md | 16 +---- .../index.md | 21 +------ .../test_your_skills_colon__events/index.md | 21 +------ .../index.md | 21 +------ .../test_your_skills_colon__loops/index.md | 18 +----- .../silly_story_generator/index.md | 16 +---- .../test_your_skills_colon__arrays/index.md | 20 +------ .../test_your_skills_colon__math/index.md | 21 ++----- .../test_your_skills_colon__strings/index.md | 18 +----- .../index.md | 21 +------ .../adding_bouncing_balls_features/index.md | 16 +---- .../test_your_skills_colon__json/index.md | 20 +------ .../index.md | 21 +------ .../index.md | 21 +------ .../community/communication_channels/index.md | 28 +++++---- .../en-us/mdn/community/discussions/index.md | 26 ++++----- files/en-us/mdn/community/index.md | 48 ++++++--------- .../en-us/mdn/community/learn_forum/index.md | 58 +++---------------- files/en-us/mdn/contribute/index.md | 16 ++--- 64 files changed, 213 insertions(+), 1015 deletions(-) diff --git a/files/en-us/learn/accessibility/accessibility_troubleshooting/index.md b/files/en-us/learn/accessibility/accessibility_troubleshooting/index.md index c4d9cdf2e9ac06a..c10c27ff60fb4a4 100644 --- a/files/en-us/learn/accessibility/accessibility_troubleshooting/index.md +++ b/files/en-us/learn/accessibility/accessibility_troubleshooting/index.md @@ -31,7 +31,7 @@ In the assessment for this module, we present to you a simple site with a number To get this assessment started, you should go and grab the [ZIP containing the files that comprise the example](https://raw.githubusercontent.com/mdn/learning-area/main/accessibility/assessment-start/assessment-files.zip). Decompress the contents into a new directory somewhere on your local computer. -Alternatively, you could use a site like [JSBin](https://jsbin.com/) or [Glitch](https://glitch.com/) to do your assessment. You could paste the HTML, CSS, and JavaScript into one of these online editors. If the online editor you are using doesn't have a separate CSS/JS panel, feel free to put them in appropriate `