From 21dae0fc040dd997be90050f0622d133cd672742 Mon Sep 17 00:00:00 2001 From: liubenben01 <14012706+liubenben01@user.noreply.gitee.com> Date: Fri, 31 May 2024 16:05:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=96=B0=E5=A2=9EshouldStartLoadWithReq?= =?UTF-8?q?uestEnabled=E3=80=81onLoadProgress=E3=80=81onScroll=E3=80=81onL?= =?UTF-8?q?oadIntercept=20=E3=80=81userAgent=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- harmony/rn_webview.har | Bin 22857 -> 23013 bytes .../rn_webview/src/main/ets/RNCWebView.ets | 291 ++++++++++++------ 2 files changed, 199 insertions(+), 92 deletions(-) diff --git a/harmony/rn_webview.har b/harmony/rn_webview.har index 70da08c2bd16b65fdafa16451da35697b5c1e239..e4537ef8dc3870f65e4672fae3699e4fa91dde62 100644 GIT binary patch literal 23013 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 literal 22857 zcmV)?K!U#?iwFP!000003hljncN@o%D4u_#bMzhBNY(;v2z*LPAW< zSF1x0fgv##FoT^LkfLdx<2-yFCywpiB+kp(BpW-)FT1gmySs@aJMnk9SEQuB@)dqn z-90niGd+XBLzZOEoWvsfQB_^tU0q#WUER^@H?$pnyl6CZZTxfh<(rt8ICt(G!GGZk z|I7ZKoH;u+Jv}u8|NGp;pHGx11ZD82{-N`_(YzHe~Vv-_y47? z(Q2&O*0#~oi@NKKk`Ca<*|TS3`+s_JTIm0YbI|{1&dp%?Q4$gNeb)LP_$z+;&5mWe zq@izX-Ih!0EzNO=I2gzQIq`Ymk!#e6t!oX-Z0(aP51Y*aq`spX!%PUi%avH%d7L1&6V%TV}(+MmZ(y zxOK?Xwya&9wug1NX@Q(&OsCz@2|AZ&IZdtAB3nA=8ej$J7vRET))zxPf=PUChSFXYDT!CC&T)(oqu}+{wwY;+aELmM3 z<&|g2R~J|23#9Tt*Q%9TjjUEro>*L7TUx9@;^NBO(#HJa%4Jw_*2&5$jO|4j;Q)1g zl^{kAYq3&8Xv>xA+!gp)zO=Zsxc+S60C#0^WuXdaD$A9X^&+5!G*Wp6evsOg^3oFGI(eeJ0S%}kiDYhd?b+($tV~CR_i9 z{nD)et80}NnD86bIbq(j!9Z8|maaKEE&#BA>ZD^^yG8>S31W406V{xrjSGXfF7bt8 z8x{f-_^^)H4bstUcVAszYgv5hjV}G;6o{Bux7r=c1Py@X`QjcdaL+?OlK=bC+q8z) zkpKJA&&G-b7ds_(zC1ewe{i*hfCfX?eckE6N^0zK6@WCYRs)t~x^`XFY%C3X6~loY zlL2Y~ThNr;q=J&IaPu2;>$up>FV@zpi?Bw)%EaU-tP5)u_@fN@u;eYm8ghwB-i3{& z0$t6#o<=+ymj}RKRJH;KLFLdzFVnVq~^lfYTbS1cSqm;?Va!c{PRM~VG=@NT zVLT9iang_u;obK>IC|s#yYGMPArOZH(h?rTumAk^2d^H#^_Qbt-vd~;|MF`_ z%kd9?0mzPj`d`rRfcxmDzc~K=I~?)HuN;5)P9G?lLB_+#e)%mP3UXiKeW=bGIf_ik ze-c9e{z%^ubooGHxEJ0u@_5TIH5&!7z7B--63e#E%#IE>=kza!4bZZS9dpNT)vfQ} z`TlQ@e)_lLU%b-CEQG=`wuIC7jDK?slPk7M0wX<$d1++R0|${rWunPqk8>U#=8a zJGxn;@@j-QdiejHn~9wNojE%>k=cKS{nFTft}#h)5D0|a3QGDC$*Im&as{CvKUBf8 z!WoOI2*K47%QaoMMhd@%H)jbmzYRG(AYeV5HR;#^Z>n6GIJpO*l0C5MpgkH4u#>Jdaaiin7KvtV< zRF{TribT;o2yolzpnOHRRV+_dXnAr~-+Bg*vx1{f)G3VBT7i_!hHV**0%>b?{Eep? zR}Hga?Kzz6!;>ej_ZlOi`QL8bhjExV|EJE)OixDazmwCM{dedumHoFvw3e}B&gNjE zq6$k@gA2{ca5A}2w;K9I)o4Z~0kS}qXiid{p@aWb0tV0;Y1;bs>~Ql(RA7wu4gvKo zfCvdir)lV|hEp`G@hzP@?E{toV)w+mzVHQd^xms?fA#Y14_?3h*N;?;XAR-MjDq`RL_u-Tv_P+aG@K=+^hHRdwo-ay{RRc~%qpXv>D3 zS{zd;AZHA)-F^MfM{m3Z;EB8Q0-(P4(ogPw{0eK-@!S7#^!6Wa|LtdY|NE`upS{bP zjET3t_y1n{`V&uJ8=iaaxh>6Uo;h`VwefQ%Z-~QltfD*EfetrwkGvbckzIFWL_cg>S*>Dq>{#?h**X0f5~j_1hXAqUZyb@bTS$`SI~jz7Cu2Ps*bXccn& z`*-jC?j61{fAu>@-~KJL=mB>T+`V7F1p|O(vqlri#7B-_{oc_>FWvj)UjXsFS6%}S zG2CnblIQrO4XM}&ZA$yb?>ED(RRmCz54f$etPo6RFT~I>3TDu!<=neP1H|t|6VE<$La5akm-*pp%DDfgtcL_Z8f?r-BC|P-a`O!lP47+ zi7GLN{s_DC^}igw^5M}N|9Sg^Z{PjRzd$#W=bU}B{v0`e?bUn#@?J30phxa}_$}z# z<5z!k_m{5)vxCjOdV^5joIGJQgJ~GdR>t95STEWQpA!Ctc+1+vm_}!3dcKj;wHrE`1RZkpFR!s7>dB=w#dNYs z&GOpX=KNxnmvA{)%5x( zC!(E8fi?i*|4-^>uY0|Jfo+K6uIhQJz z7gtKSgl+P1Ekb|+tAZ+0=4kCsOZO^EeTmpuwl`-0^OHnHrNrUGadGrVK=Sl4zYUd@ z`Q#R`HgN4AkH9x!(4bpWwKC5qTydO_&o$=qY8Me5&kV6~9DkKNofWNPT(S+&t9W6` zSr=Uc-A$Y#948PFU|rj|1nL{X--?c)wRk(6eqe3N9YHzWM{PAzL)1vpLpggDJdB^h zU*JA>umuK;k-E*CSfoaq$IH;XCrOYiix`@H@v1ND(NtOT>AnCaq%Jv(Nih`FL|1i=YNz+a~5oNZn~uI-W>BpyRExj&}v`(a?x&o7du3U4T*@E6E)osq50x!kRs_Cz?x&L(SQrB#>d=As} zW!<$cWlohJtSB`a#Gd?5t3ZzzEUIY2^%wpy0=K8a1l>z|(9cSKfVDq-G z+kx7Q!bg@{IRR!JWU;GPSG=L%)jI{kFi2g{sBAlhy&6`~3*>6$5+y{&8LZVOPdvpL zh(562yvzFonc_l7 zNUzwp__^8+%M{UQJAVEak``)2DW+9?e2;OpHq96hle9!n|xIFmTD^9SChO60P#<9;-5s~NwHX@^OXMEW3r~!m2k2~hFdYkjHMhq@T+=^AbyHCnZ{k`)cIiW zOL9vr7n(1;T6F01szj>mE%dC?$rJpFxf>H}a z!HbzPk-nh49uc#5KYkMw=1+2$a_5_Wg6-v6?#@jx_e)H(o_t45A?5U4`|EoK{d=JT`=I7Jg{0vGvUH%EW1-$(q z0Q%^SUmv~m7Sz7`@sC6Rpzt5P`$GgE@6Hhd?COu-zD265%bYee>U`@DzSj(Hns0rd zA!kMzZU{Ph`wvGyd+GS+@7{U)J6;~~F)^BMfBehiub~O#8hI*g0CGDm<&Mb5GeR?x z$MZk_tH<#7e|`Lom!YYQ{%aoYqxXJh;FEH``AQt21FJ}09 z5!u@J6(=%4ozZ=t40ZvF3ZayZOni>1e9!gMV@sCSa0m}0a%Fva3GeV|WTU!B^7Q7R zMUURJ7Wb5N#t6Sxs}&(4$fis*Of;3~ji>aMXvZv(nk zafHod=s*>^kDtUuJf-GmZ3TKp9c7|Z*IK%>218@rS};;E@sef1ifghVR|j3swptF^ zYw9qnY=5+2297SgYl%4M4Z>~1r3L6Zh{xr+scoT89wv4jtZv~|PIE`6Nwj8B!oJ0^ z-_K8CB4?nK9cH4d+3upb#O4nQ4LzBW0TXw%R##`N+_tEbqA2%(8%`6(C8l|^lk$#V z9Nji-7|@v0&p3SmOiVKp-ThV%wuKRt39UpdejydP$R_f>)uls;ZU>DQbcw69(y$X7 zBr?T)e?M6!E-gi}LriQ~?HcSmVLDgn%xd&vXk;W>-jw!d^!(~F;XrXVvndM$Zo`2| zO(TMVDCNE|eRB2ToX*et%j)1vWLy$gXj!Eh-MaE1n3!U9M!Dr&fra)37*1LXm|(S9 zi)O>9YcQ4+997E1hVJ4GaZ?W#7>zW2sIWjFSl}&(OP3qKZ1&6Uhg2pa6Q9v-P(mXt zRF28?Ox)#AN5{g4m5Ft&-b^bFIaE-#177*dM$_uH8mOj_EgSj;vJf<^$s?T14>c2) ztw!n<8a7@q#BA86FqLLcV_{t=ARJ@B$9|WK^xp&6v7}g7&?@@BEUTSb%XyJ3ZU?$? zQ-hfa+dz%$HJ~wqg6*Js!>1}=g^9E8xOy8sQt5RB$FS*YMAd08P=*8hCfp$E_BNiy z0R(TLTlIR^c8Y-Aq<*|3ty{_vG8n0zrGg?DU_y@qm6e zfVUcVEXU>8Q!@3T9f>u%u-0%Bjf3*4;Wn%KKXrA-Rq-{Gp?jc|SgS>G;;0N8f$p z?tAPA?Ct+x4x2|mzjgc8>*U%xyRhbm3(Lcgu@Rn*a1ZG*f+tt+|M~7Kzq|AOKcZjn zt$#my;*_Quz5fABh^lb%vNAfNqD`t$F9aBqrrT&mI4ZiF~`-2a-G7URE9PJC`+ z@@#hhV+5Zv{`;idQm&|WsGl4f`zCHqOtUsTAgZ(Pll;8-PaRrLclZMk)R%c=IC|ax zJQKP9d3O427XNkVFU|cg>KBvKItIovK+keu#}3_UGvD(Z9T=OfDot=kJ~9Du)-iQNC5K9jBgLw{-JKXz-vV7nsX!YUwz7I zT8NEo^GIzCq_%2vx)_>XVZSu*e=_?|TX!`f6albg ztEI2n4H`uY?J0uU2ZsmhSv=Yn6qsfi<@I$~%wRDTE=yC zVR5NaB=f6uv8~L5+DVIIGMQhj!g8|oY?0fZ@ChDc+W|7P~z%>J9%e?P7EUmlnxGxrYhdFy}C z00B8(+yNP|V_Nno!~gg8|CkEa|1;Ap{(tuV`M+Ct?!zmvJ?8(^xpU(DNB{3LllUfVHvfnF z)bn3%Y3lc1d4S!Z=nQ`{g z>G|JuHvfnJ6!V|*SNujl|L14`9gKCfteG&hf|oxqP7>iB%Ck8X&& z+IIbPL;Ldd>6tHYO`ZPo%-QYJGiPRICbjx@eS6|uPJ-^_@I@Tl_s`~7bW042`P$1z zZ@%8OTX+Bb{?XsQiIMHz`R1KB|99{##swbSXG`A(RcDR9q9%)QS{;WnGw z)>`;7290OcHym0^1QR^4Av}I}fyE``?XF!}y$YbqORJZ2EV@Fpwp8H?Y#Wzw>$nNK zw1uU`x%HY~k+Hs4J=n5t;y&@2$|i1lFIScpYwPKdFO_TSo3PyKjaC}?iy_nIn*pk7U_?`g2NDWXnbqoN~u|35h~JrRljaAqp={~G#B6aV4h#OF~j zq)PVZKcCy8PpNn>0E4DPU&koAIz~|e1sRGo^sVlWcg-3TxJ6(N?~IqoBx8V>z#ISn<}DFz$$J5bwejT=Gz+?gVE z82eJVhzH>cQ{Go=tN`PKmx&BI@%cl@$+79-vCF^U9;p1R1-v3YW5=0>4igBEUf;&I z-u=7U1^SD+TzfyJ4094Ne*QYG%pZTCO7()RBV@Y!W;`}*x2v_5X)HiSt$ky1iZ*vb zYV9)Xpq%dTMsUic*XXWYhlZZ`EP23vw!et{w|O9-5o!Vbum5MK&t>}G(BHuNzx?Rp z&~zlP{}X2>BJY2nJ9{p({}278@&D`jPUhq^f3K3gPYD^9R%?|_{6X*RSnT~sG?e8p zFRfmZ-VfZYRp-!4Xkqd4MzyjzUs9Kow@&J?!TG)Z|44c-`s!sxPyU($82OzbI6Wv>NcJ0 zAWE)D2X9ygvV$DJ;m{>|!{AR`p%eib!(Re&NL$+{ zbqxdW!;rRY)GlCrH?>^@9}e5qUC-mxb1*0)nKmxkD?eJ%vg9n{4lKhrs-N5VA z!ZXiE119M=p_YlF&T;7)+FGur)fM7DqPAS!_xS)bw z@E;Y$*7?80c3li3RCE=Pn9z|IB9vaF52+rK@o^GjOeED~V&>@knfR3YzdX$#WjGv( z`v3IAnR8QN{eNO6i~l(Mm+AkR{-5dpnf{;Y|Btf%FD}M&osOjXk47;*c>>=yQR$+k z5}xZ)U(cHHg3g?;^Q+M`!rw`u%Js<;Jf0BLbk zqz!*^<$C^k$0(J!2PApiW`B%{alf@LibQRnKKV0CXoXcO;qqSb^Fe7|u;}P6_dwnE ziWNw%Yqx+Lin|DZr?1FgM)fQ6-{}FkhKq->ygL1rzH(hNFI$&jr27E;ls8=t;sOye%8MZ($E+c8F z#-$yu^)QXghS8X_HK*yb(n}Z#6Zu5uZJ#$9>-4Qg5IeyvS7i1x-4)dzCjMsg{t=t^ z%-?-kH@h{xrBj6+$7(b+-5`zDdzeONOWV?e@kxKBuY5z__p8F+=_@*v6*^4Vo30N* zOdLr^;(HnM)}D#gpa;dDsk&}ksPHiLS%cHGAxIV>Z6v(okG)rH+p>Xo;?GpPYY7z| zCf;Sz_`yiyUL%@@Ef{_LY+^fe)`LGYsw%tFLKAAOKE%DJ>)pt&TNOzd|*vx(Kn zrc*YZlEInUuCYUHiPXW^11Be^2Zxh!p4&k;s!Kk+Q2Hq63Q)0QgHj*N7B8ir`Qp{d zW=u9?lEHO?k-`9Z38Ng;^fGWTqUq0mhBLcNoQ>sdEcYkvp`& zhyQn~$n`h>)3xS6j+JE%Yy$CaO zWgisqari$??duLvy#;caJY8GdgxQ8;NwG~KB_5<8}f&1VOojwzUY?`_HQ@P_;f>#aGpp8C>@k@){O2632?D zOnbUyv^CKiEe9by-hGgG7zy_{9%a_3T>fL)LmlU1NWY=)$K;3}@9|_ve(N##1^4fG zK#~*pBhxX_rs6h2$TUos3b(lO!GV5+HPE$f!sJTGEq6uQJc`_!0||1Y5d4PLv_aVb zX(1$H+qYRWh19B!ybRR^y)ayR6-2uo?M5J{&f#mauet~29jmO0o}9S zB>89#esv8Nq(qRV66Hn7+qdTG_%nCDe>edT17O>J+8_{x4hTSQ1&M>eWZf5lv+3_a z+w1ka++r_v5U6z61mG%~o&w?^QcnqH7@?;GIGoH=f*eHT#Wr>riKhfQtiWR)*pJl2P8{o_ z6@Y=;?IXpZWZe%xR2T#I%yZBxty9Pw**pEWJnGz;-u!%xso*7ZF)Ssdk=%t8j$%qlGD;y?9 z!mu_lW`bADBdb*mp=J7H1pW^Z2}M1S(nba2)0GMU4oQNNE{0PtD1!zu>IpY>q?ulj zl0u#Is+$z*BW2x~&;}`MCtUVU2|;QTTFZ2J&{C_h4pUnR!^Z$92 z{eS3U92@v|E&57^^4$+wZcVct-KHAxO}E!m9Z;!5QClW|$JOcADTo^d46|jR8jpI= zwr#bm+TJs$)NsQtLze@H61{XktQI<+8Q24x961Sh;hDizD@fW3(C_GWv z9~xL+8-1a!glTAtsWuPl@|me!Mpl8?Gn5-asLYH7{6 z^4yimW@V{X*<7itUtO(!wLi?!`U4QLvdZA}huW((aI05WmYyA?wODV|GglZ)1I^r+ z5fL+Eq>&ag|9bay5^%-1N{Pqo)+Ffufa!~N?6=-D(^2usND_vG)4Xil)EnG-HcF{t z>Yz>}5A!f;kp5Vyzlo)__OyMcUqoeEt3OQWVGTX9Wwh`bYM%(_#LA3qP8V5um4}!RzgFNa6ZA*GN_(^RjM!)#mI!NC(8W|d?W(Sk%)u2{?^RR7!l<%<( zmM|^T3jHBz=*|rc`;;EbJgae^=JqgJdkoiOMy1%B$)jH6ZVWKqS83pI{>1?D`r`qt z?DLwd&FijScP(lvaF#XaM$FtXT)pjhK{Iw~l?y^2Up%1j4|yxLK{#_FY3;|cIw>(I zQh(y;q?vRfYBXrvl=fiUV@r~<3;}~ zv!U7aqTpZz%!wcdr^L0j`VHvKm2P`0tc|55WnF?XI4#>PJi-}*sJ%Na+K}-(8SkJgT8umm zt!-2w`U|cA^}v&!Oj*%8nysRJaa{KoWCtm}GG}EJ|6N#o-JI&S8;?k}D3SBp-+FxsZ5@?ZvP#92T)4jN)*L z0&iG!Abnyd0Z6oA!K0LkgHL5wGJ?lg@uJ@Dxcm7r1*D>GgO-`+KVY2ixXt_+IUPXt z6USuuT-{_f&wrAJS-oLsb6N+`>w&|~W%RNcPee)pOu zgW1B<4f&Y8DW6nv_Uu%givi81&7hF617i2n=KgRLs|I3HE0hyrgcKw+Hg3c};A4Us zyRo1a?QN}ta(%1ILgc_t(U4H^v0U`Uy-?Y0cQ#!M0YJUtwqZ8%G>G|_uqt?E9%F?- z84RtZ;nuS@@@l6qIy(9n7Q7`_2!(zaq6DuTN~F-(?_pYKsR4+=dJ$^G81i9q*v&|Z zARgsDOcF0S08y-Fge*B?ewZ-kjVaQ_;@OAEV&w*)idKveB}K*`#Sw%zu0x{On~m34 zB-r?x*K?n&=4Eyl(cpG}rz4G4B+ml+3~*!`&~k&!1FRUG2;%F);Q@C;- zV3`4^foc(2gy)I}U;aa#m2QlMs(AzKz7H|c46G*QVh=-dUIY;xWV91fTaja!XzF|T z^L(#Zd%+mN-iy1t3`7xSTFpX3^QNpp;Px$8FPY@J@L(^~g;Zg+uF^puq* zlb0BoQGV$Grj=JWGPk^pxT)UJ9B0q68xo0LVuVD$^Z+D!bt5Et8NX?&yRKi+wT5o@xjw3E$1Rhg2_e-S(Y)wm`4g#WG9qv`9C%#jcb^vw+reo9 zE$e^bl=$DqDJuzrV0jb=0JT+e#F5h&k5U}{1;w@YP#HifLiSs;t-)Sa9!?_ULk}|V zcb@kNX+Pn?b)Oeu+mP2^+lVf`P-c)-*EXUHu5HAvwQb#PTJlQEk|Ol*k^_*$YDTDH z$?-ei#(rqu+lXrXwA4U*-bPgC$HX{tg4r5S#M2@~d1Yhi;`joXD#;WO%gcH6#**l^ z9rJauSYWD7Qck=n8Q-HdYWYI#Af9QIM&jH8t8$y_^s~C_+T2 zY#b#E-B!z~+q!N(V>EOtJt?7z$+UzDD~K^0HY|Vsb+A-)gzAL5B9tus!!H~nz)vsu2xBhr1c)0}y9TP3wxd@}^nGolAs|vIL`Wn*%6~7GHpmJu*hebF z;aU;Q;R1j?m-bVBhE9w8^%wjJGSS#=s_pbw@-YsC%mXvruIEv;cXG*>9XuCQFGNUdkhLgI*s(NuvR+Wvm*+FkC&`x&rb!)+JQxPFo3AH+u ztH7wcm%2vFT{QofWwmiw0E<#7AnKa2?N^po(gW=2w6y&J=uy;6phrelIiDEI#=c%gtw6?3&X!K(KT4f59adqR`9#>uxO&X8k zQ-y6RQ{~sKjp|Zr^*CBJQ9+Itk5c1cXhR;wFo@N78AN*5*3)lYlEEaa@rhOAb{LCv zTS_+}YcTEU;Z$m36_t}oR8)u~tZdj=1R69TaWMdr35=-}M^{3wC%Oov8)-dY#ImSIJvFtjG0!ZBd2t;a#ebB?%odBYL&6U#w9GaU4#rCG4fs+>ebkC-tU2 zR@E1B6k2}VWj|r79d^i0wbKq)3U9Q-`66k|KDb%e9M|)LP~HK#m`~>cFSJFk>n#kZ z1?xZ+L&K(NN~lh_C82Col8S#7vtJJ23iFUIvb8| zmsynG6a@AJ5=UsyiVBkq2A^~SJqGkHVEZKyxs7@H+*+!M*&9l%VWwxzD9!C;zua`j znnVzB)b^+rh~<>7+(DZ<)G*Y?JeDeirjL{t#ns9kimXdh@&ph-|Iir#V(#Gj@NgEFGn%>*zH~ z_!^63zGhjewz;Z$akQw)s%AF#2~0PKdEtnem8Z*Qwr;0`7blndK@q7G9&+J)2_@a^ zOYzy$+784@Dhq;`ALZh_k>Qj@8(5moN(CscF{vsi5#NW1iBt+r z$w+<_@1DMeR?B&PtGmO=@MJx9QF?g_kbXyEwi((={qM{Vl{N?LfwrO?Ej*w=vi z+7kBwlEC2Pio$SZ5DpGU`X*8KeR5yI`%leL;YfV{Y4Yrub2E|mpJt|KviF~c{j&F; zviF~|_n)%&pR)I#9{Km5t^}_?eW7D(J8g|3k=}y3P&Z81#WQf}VW;OEV;uh9>$#_P z$1*{XI^(#N9QW_1qV5WF=}5Cp3Ch7Wz(Hd-}! z|Kxy(_a6!*<~b3b;k^VRmBS}IV(>&>XaGvl8w4gF4f$Ol(vt>p)FwKZ2rxZU32;IR zTJE7shR+EUd_@X`#dHP%#G)=!09^;yl*AaGv!n~7b$V*kRU(YKbtHr1*THyLPJlj1 zE?giJe20ThWM0}NPm>~FdYMx^Q;t#Trp?OhWy8epd3k_9fEL$ z5b6;rk0WO85CuXraK@Ya{D&%Fn=%XQuyM@aV2_Up#gX!-&x3IJ-dpJUwkxNwh*@$P z)mqQ1Foq-BctHS#E2%Ufk|K1#4Sin;GCtaf0=O52MFHQ7exgJY6TLx!AqKj4Cq4mm z0@b#m0LiYBD>Cp(cYN#xRgT+Mah%^K=2Ww>`*dw_6ZCr2TBVD)+lC2yiW1v;)q|V1 zv^gx1#{QG8|Bk_oYUtY<3#$>ztf!4_5Pu;!{w^?$PT=WuZOy(xPBT>A#a}AsLkHsA z{&qfGB6O2Bwpi$rt6VOkJcX~P#@$Jk>jxT?f4j8T-BOXz$W2h0NO5#TuWlYlpoA-z z3XVkYM8;$4aYOMyRY!55&@TrnQ20XO!9<9U5e+eXfv?xCJ+ZNhYjyFhmG8sJJXKv* zQ!qDlxlC0;dFxAEP;nhgT~K{PN-m4M_pUbuOs5dy?i?wQ33r9!85wtvM>$?%ZrL0t zrg7pWm)Oa#xOWm;Hs%UQY!J>?~NuXJKpbh7Mru9}i@ zp5ThIJ)N-?b$WY4D+gdNCA){)vMM%XI`?IfcFE~j(KeMwuu`nYE+8yl;bN;OruKbR z6jV8;D#UG%@R`2P>4B=2`1VrN5%nM{^+o?q19fXkga{W?LJb*Km0!}JFro?*jT#a!BQk3lB zk)y03`_IH_Lm}rDrFcm4GKs4YFfEzi- z6Ac+<`^I`rLUJ)LpcyNohMfnhFmzr(J4g|Rh+zmtKJJev7(?-XT@pz3Cl4g--{$`*tZ(J5MX|BAgZMkZ)P*Y+jS6&2=(MmRY9mYG`95 z2NQ*UC5N~3649uK-Qf6?@KlI zZ)P&{{~r3w_J7&_FWdiR`@d}e_bJ=|#d?5Ov8i)byKR}{($alV-ZidX84s&`eAg)N z7tv=*;cunX4+58~h=vSM1jj3)u0NC_8*74xMm(U^_tE&2`XBEcdVEuX^@g8%T!F#f z((S$#!Q}gY=VqoO_W$YWvzh&W=r7a%GW{>p|1$mW(b4}D>P?{Bm|DjeXKLIg{28Ov zJYA!jOeiCEDU*u&rCgX_F=lkZUar!W#M>McoOpo(ot>fmo0V!6crqK@PvYqdiz|z@ zD|q3DXRNMlF2mS@o`pouyi|jMzBIpCTZf^xN&Tmh`JXzd>DscYtC3vU?=-Xb4F8dUr;!;siGlz4>R6+-E>MMOGJ3#9Hd z>0~HX*EOi4_`rR~s>h?kyDilAG)waE_t;gkKJcEeu zQi)zFV|pQ}gU;dVE7Vbi1rQ9C6Yj5x2hRvm*iO>3UyFg9jUl8|iXyWmt%?CCI(ne5 z(yM9WTPHbID3_*Q@cMTSRpwN6RF5g8udRF@Eyp$xsQ@UR1xk;-*E2f(f{K0YrVl_~ z)VdtyPP%>zy_uIDnd&+3T-mm@{q%VG)8zehS|t2qf2@|n4)#@75wEdN+Ecu|(+54V zkAW#*a9>$=3aPITf z8@lHlmJ+<@?v()8_XtY~GQrO)0ZWp1m}0~*{K1H!0n8XP=l^`BH^!flFKPe3qIHZ> z7yy#@|K}#BqWk}|Q`!E1=r7ym>LZy20!T4- z0igg_h9$>z{DfN-Ol4zxb(*Z3y9EAU5Y%UWKveVHyuEv`enMCa4{72docL$(GQn&d z`JOp}5l3kfFe;qIsg0t;fzpG$#y;@WsBd;G0|WcAkU5O_Nb|(!5-#QgOhpP&?FcSd zMKEl9gC3$%PkN+xEI6Lyxp}GSs`Dlak-gQh>RDR^fQ%zDOcfXrLQ!ipd_6wbwG9wZ zv`wck`gWHhB=-l01*lPhVmbXm!>2h^urR$pNcd)l3KFLGNfUeKLrE6P>XS0|&WMsY zmZgFxZK8RX%W$I)1#|3MSUT@Liz|OJ2$fBY6B)@$0ZwToip?LovuqH%NL~_JWa;Tr>r`c+($85>r48 znhU4oOKDvANvoz%!*l##|7P}~NB&E)|8PZn=!d|2#Q#1sbv9!EnLIO**?)%pGW$nf>QeWd9lW*CffNKe*pycXBAyl!br$$aVc^m^le`O(3;sf5vT2R1TFColHxqP1gE5)xH11MfT z{dwS@&eP_0O#_D2CeV2yz6&o#dni;QpKwMW;V#2@q37tj=x-f3a|OEj6Iu}qpJHCZ zj$#++vb|O$6me3tBQ$m*6u_VaJc($cWczRJMd|<(1poR&6+@z4T9@|OWrlEzg#x($ zOw-x}apn}Fb0jR~fZjuS&lVvw5P5NQiX}!&XaG8%(ioZRa5Cev(@+^lRt!v}@l)m_ z5!wIgt}{M|FOgOCZP4Fg4KBLQa5#Fz|DK#V7uo;KOrOj4f5U#+{x94AW&6Ku|M!UP z|MZ(UAov;l9LQ&3Enmx|f5U#6{+H>0nf{mQe~*~{XSAvQ*ECwz4#*4` z-lv|jnwC?fDW?RBI9sP=osdOlRH}m=Ti-TrmIyOjOIh2N-PT+$3lyJI|8T&JyN6DJ z1b?5BY8ejoyeQG=A-ZOsXPVad6Hid}=Lu2KEV3k?@l;2%wKiF!6cIlPheO9dw%gTq zigH;VGIXB(!@Z7p4M(@BME1f`?lp~i6GgBFLincE(CbE9!x!vb9T^4!8NEdqb0=<2 zpgfqkxqu%>Iv!S&W!@o!miNn@&Z$C(;TY8%AWcjZJnldWeI{L2GZ{R{V}G0%vi#Vn z><=+30LlM4FDSSTOvo3DMSN1xqx9PKu@VaneGt-NIRrt4rQ@r}zzCESM2h(jHeT54 zjgncM(_)z0R!>qGK3cSIbQ}+eNi!uLT69o6EW&p>M6B!}m=1;QACK#TI}kq4^QX9V z76zR+#@NVuK>F3E;Zy4Wf$6@ek6;s!sQ;gtnVy;8`v26K$+I)lp#PscJC(ivIP@3M z|2cofkF8ZHHvlu)1|Zu2WE+5N1MrD#01ilS?p`45_80Y}DA4;$mo$f6R3eAoE&-2T z<>wx)j&6dmX4VTOr9@?j5Up7gVm$Yc5Pb!z1dic)A-V(7Rzm%3)7% z3{clL{95EiQq|cV7|dcfkt8g5p-4*LS8pIqP3^Vow3OR!$#B>WpfJ76>u9}v88!u; zmsU<}2+hA*xwQGrV&y84eUAbFPnVx5*XF8=YwMefE9;f&LV2!23u7;_@H$>4k?Zu5 z8~TqB@iH5ML8_Y#Cp1o3FL;fOHXpMimw)`tCEHenukwf-3SY00swQ8Mi588yBtoknGpHThm@zdz#;OY=k*H-Sj;^NsSG-KKy|&rIHIOk zofDl{!5F+`8;u?BT+4D?9vAiMrcp@PJKRP)`x;b;j`A>rNx!6m3_bWCbHqIHl8%9s@p@_AQ+j!`1H z9Cx;4YK4%1N`>$fl?5@EsS23FS?Lw=m6opA(6_HGZ~d^X-~8eR55= z1Fp}pm%^7Y*`yLL@5^f(iykf!P94X0w}X#$!)D6UG83!9gmZC$!Fj+}tm0Mn@0_2- z4(;RfxfgF(&+w-l&IFqs_@nzITkP1fy(;~Nf^tG}1$Hx4)<$aww$o0y+aoFfWXySK z#d&7&Q;8wp>YU3_>TO@ij^@Q`L7pL+mTGEFmG@(yOu;<4xvwrC@V@N2NOBC^ke0B} z(stAZZ5_Q{88fQ>-#E4WAH~|UD|4IG$_niK&PVhM-cizlgcyIj6rQAFobk{Mh##RF z9dBqtZ{~xsId<(j)MKi;fAr!{h^w~N=_p8;50}6Re@HZ^XF;~)c$h3RQh?3D`~Wn_ z%SQwN%H$|D!I6Y%xX);|fqmk+z4&JgD0Jw1kva1C<3viLKO7-aLU0bj-7nZd1ng`I zBzFyE>UAo_(6H9+z%rrd{CmCuvY_i+|0B9ybSzHs_W;ZzYEm*?SnBqt_F*FQki&^IUPSw!fD31=@mreN%)f5UP? zo@6H-!UbyoCW+_q9lXdYk_hWnsH0I23H39E{7CBN=Xf`p()!NgtFSI->*8}jXBh5z zX)G`$C`=&CGvVyBuR)<01JEOR^^{=&T#9n6lQ17cQzemrP>HW#phPBM>9k9vLK2!G zzclbfMnw^)0LFnmKTv!u?DsPB;vuK-(CR#V^IzR5h$5wj?8NYIn={@dR z1lin($gNBJ>)OtRUefJi-Y4KO@2*j-;9@j{oH?RJl%60H2>stu&37D()f68EG$|CaI@r#wzh`{NnuPP zSX=M3w7M?9ED*))$8c0-EaA-KniO&}Ii}kHtgZ27;UU&^9G@=Pj5XWED-(8`LMxA7;v~iP<@DuuV?z?v(aVyq+N91^&R|fI4*0fxNVDk&KpK$E;`# z(N-C*rPVDG)#M)nmfLDK(mYZ>##t4(cz`@ z@h;ACiI3dSqu^LHN90Uke2H(qSmw~{dwQ>il^53szH^v298I-(h_Ub$C1pE}Inl2X zFFeDfJeR1@Z(DW+l(&3+3*~ct%a2$njot7_Xy`DN^kB|NO-6v9{1BcJZ1kWj z3B!tI>V1Ltj>VFIvW>(5RO2C955W6zV52Vxiutk-K)}MFh}|Kk5Cr0uzwVvN@G@1s zt{c0;0v$#mO&)1;U1uekXRY9=8`8x5LC1=R)FjGj9#m8aDH?iYF zd@iI(r8P(K#)mDH0#8JV(=`K1^11vrzi^4Y^p7Um{E(Py6W8Id-1&br5657c3+s42 zY>E;?Qd$-{SUDl|la9n_&xrb0>P`_g>y-V0!i%f5q4Ed(1lD8Sp`xazbpj0P%=0q%(M^34A^}gKZu666q%|EB|2SsHeF_ zVrD-~qH%}4{GFPyto#FI>{fJd_Hc66d*!?j=6bJ9KS=&=hc>SdCwsY1!vY9dryscx z)Ox_uAt2--=QQf$Hr*Sf=W|f!6Xh~(ui(XSq$?4qRdIM&>-%x;Lszo*`(Lg=a^k98fyC;V6 zegX6$?>cjSmnnNB{=wQ5@+|(gPbS<36mEW=;jCMo1)JWl5>H|hyAKW3USPX?@*R$= z`j+Qx&-<)re|H7=^!=Y72xw!E5Q@NfGw+!uBYrWe zEzK!^kI(GrrvN&yFZ+DRi0Hl|pXXZz|3*uN?K5H#i`xv2II`P_L7T9bxljH8q7yM6 zef)VV4><@2@gR%!@wj_E;{ptS_PcGr0*CezmgTbuoJecx>efUI9Tl^oq9UFVezjbb zsu&$2zImR_BbG$E&~S%}0lFWx7P<^An%kCemd$#OEl{8dR=gq+Q=boDPQLi40)Ry# z0FbuFSZQu#mo+hk?J%DAm1>naX{}V&H|G~?JcLVSzO-7UncTl-u~v(^Krkm5IrT90 z@b{VM>l65Etgrf%hkpGzdA3If2ixNNWeYKA|Igpw!vchW$-1<*9~WT{ZGl5ZL&W0rY4YG-|M}>^T&8SIVZE7;N!9h$CSU zqqNj@5F|BQMl>K&^j=Uw<4oH`jfcV`p!^ASEqZ`*iRSA(0w zp}RL;fm5e?GsAB^-GsB7t)|5z>R?|*z3c;$<6Pc_`BYSG{QWx_vhvUMc|WET-8-gl z0@*ff$7StEY(f~%tZzi_t6!pE;#(}%Ls1a9gbt1XZ~rkGOA+j%Ie0_{O0O2 zu*NRVSJI9w4jwtg{tS(%2>tAEm-e2j1&Z+)>Cy0*q_UA?SDc21bV=!Ea4<+inE9nL zHMGPTBF%(Dm13A=id>;~VIt0`g3fO9TlUy4=CqoydLIL1%Xo};O>Ft*N z*er`3%b{Uqp(k#ZVs%(vsH(SUq{Ve>jhY;bHw$FH|62ROu|)RpP>-)i{BQ5M<)Na0 z_jvzt`b_x!pQ(v+QG7lG}Ac!MwdU;0LYWe=u+kBQ}n(N0AqLI-rrVklj2>%Nu;0zSIvV z$I_P$Jy+?gvDXwaMX#3#l0tXVir`xjlzBNoRrU&H&rhlUMXXB0Jpz-g|DBmU8`1wJ zC#JIZABX<3_a8I$FH`?A_3zPC{|+K=e+N&k%yq>KLASc1In8CQBfad>b&Xb$XGkg( zeKkNn5u)12#>#wU4u==jCqpMUOvhZ^gux=FMWgpeUW$>PsT70fb6cMGPB)9VZh|7W zq;#Anvt;tTP%?}NYdIy46&Jjq`yp;#r+ti$|>id*D(G_ZhqszCTdxMHGBxtxIs&HgzshQ} zH|(PiJNW0tv9yW3n35I-HcU>o4}0jo$o|jfcX6C?JPjQm1rFE`ojZ3fZvV&r7WXO> zljo);Iv@A^V@of4!xnePyU&(0Bh&O`MyV%KCrUZzS@61OuS|{-2zf$=3g&zmdrQ2h{)5 zS^p3HjZ*%z&0z6)$1?k-VzBAa+wHt?FwQHM#M$Ly_Ur%m{H$_W;c>)DR~;r&vt|3e6X0p|bI%tSW- shyAkopMAZ))cW5iJpZS&`9JiR&HwDnzU<4s?2G&Uf8Emi006840E{-ODF6Tf diff --git a/harmony/rn_webview/src/main/ets/RNCWebView.ets b/harmony/rn_webview/src/main/ets/RNCWebView.ets index eb754266b..88fc25aec 100644 --- a/harmony/rn_webview/src/main/ets/RNCWebView.ets +++ b/harmony/rn_webview/src/main/ets/RNCWebView.ets @@ -22,17 +22,18 @@ * SOFTWARE. */ -import { Descriptor, RNOHContext, ViewBaseProps } from '@rnoh/react-native-openharmony'; +import { Descriptor, RNComponentContext, ViewBaseProps } from '@rnoh/react-native-openharmony'; import webview from '@ohos.web.webview'; -import { CallbackState, ShouldRequestUrl } from './ShouldRequestUrl'; import { RNC } from '@rnoh/react-native-openharmony/generated'; import Logger from './Logger'; +import { CallbackState, ShouldRequestUrl } from './ShouldRequestUrl'; export class WebViewNewSourceHeader { name?: string value?: string } + export class WebViewNewSource { uri?: string | Resource method?: string @@ -61,15 +62,18 @@ export interface WebViewProps extends ViewBaseProps { domStorageEnabled: boolean scalesPageToFit: boolean messagingModuleName: string - shouldStartLoadWithRequestEnabled: boolean webviewDebuggingEnabled: boolean - // nestedScrollEnabled: boolean scrollEnabled: boolean + incognito: boolean + userAgent: string + shouldStartLoadWithRequestEnabled: boolean } + export class RNCWebViewBridge { postMessage!: (data: string) => void; } + export class WebViewEventParams { type: string url?: string @@ -85,10 +89,15 @@ export class WebViewEventParams { } } -export enum CACHE_MODE { +export enum ShouldStartLoadWithRequestEnabledStatus { + START = 0, + END = 1, +} + +export enum CACHE_MODE { 'LOAD_DEFAULT' = 'LOAD_DEFAULT', - 'LOAD_CACHE_ELSE_NETWORK' = 'LOAD_CACHE_ELSE_NETWORK' , - 'LOAD_NO_CACHE' = 'LOAD_NO_CACHE' , + 'LOAD_CACHE_ELSE_NETWORK' = 'LOAD_CACHE_ELSE_NETWORK', + 'LOAD_NO_CACHE' = 'LOAD_NO_CACHE', 'LOAD_CACHE_ONLY' = 'LOAD_CACHE_ONLY', } @@ -101,7 +110,8 @@ export class ResultType { lockIdentifier: number data: string - constructor(url: string, loading: boolean, title: string, canGoBack: boolean, canGoForward: boolean, lockIdentifier: number, data: string) { + constructor(url: string, loading: boolean, title: string, canGoBack: boolean, canGoForward: boolean, + lockIdentifier: number, data: string) { this.url = url this.loading = loading this.title = title @@ -117,7 +127,7 @@ export type WebViewViewDescriptor = Descriptor<"RNCWebView", WebViewProps> @Component export struct RNCWebView { public static readonly NAME = RNC.RNCWebView.NAME - ctx!: RNOHContext + ctx!: RNComponentContext tag: number = 0 source: WebViewNewSource = { uri: "", @@ -126,10 +136,9 @@ export struct RNCWebView { html: "", baseUrl: "" } + @State descriptor: WebViewViewDescriptor = {} as WebViewViewDescriptor html: string | undefined = "" url: string | Resource = "" - private unregisterDescriptorChangesListener?: () => void = undefined - private cleanupCommandCallback?: () => void = undefined controller: webview.WebviewController = new webview.WebviewController(); javaScriptEnable: boolean = true overScrollMode: OverScrollMode = OverScrollMode.NEVER @@ -143,96 +152,91 @@ export struct RNCWebView { // nestedScrollFlag: boolean = false; renderMode: RenderMode = RenderMode.SYNC_RENDER; scrollEnabled = true; + @State onLoadInterceptStatus: number = ShouldStartLoadWithRequestEnabledStatus.START + private unregisterDescriptorChangesListener?: () => void = undefined + private cleanupCommandCallback?: () => void = undefined private eventEmitter: RNC.RNCWebView.EventEmitter | undefined = undefined private cleanUpCallbacks: (() => void)[] = [] private descriptorWrapper: RNC.RNCWebView.DescriptorWrapper = {} as RNC.RNCWebView.DescriptorWrapper - private onDescriptorWrapperChange(descriptorWrapper: RNC.RNCWebView.DescriptorWrapper) { - this.descriptorWrapper = descriptorWrapper - this.initVariable() - if (this.html != "" && this.html != this.source.html) { - Logger.debug(TAG, "[RNOH] html is update") - this.html = this.source.html - if (this.controllerAttached) { - try { - this.controller.loadData( - this.source.html, - "text/html", - "UTF-8", - this.source.baseUrl, - " " - ); - } catch (error) { - Logger.error(TAG, "error: " + error) - } - } - } else if (this.source.uri != "" && this.url != this.source.uri) { - Logger.debug(TAG, `[RNOH] newDescriptor props update uri: ` + this.source.uri); - this.url = this.source.uri as string; - if (this.controllerAttached) { - this.controller.loadUrl(this.descriptorWrapper.props.newSource.uri) - } - } - if (this.controllerAttached) { - this.controller?.setScrollable(this.descriptorWrapper.props.scrollEnabled) - } + sendEvent(eventNmae: string, payload: Payload) { + this.ctx.rnInstance.emitDeviceEvent(eventNmae, payload) } aboutToAppear() { this.eventEmitter = new RNC.RNCWebView.EventEmitter(this.ctx.rnInstance, this.tag) - this.descriptorWrapper = this.ctx.descriptorRegistry.findDescriptorWrapperByTag(this.tag)! - - this.initVariable() + this.onDescriptorWrapperChange(this.ctx.descriptorRegistry.findDescriptorWrapperByTag(this.tag)!) this.cleanUpCallbacks.push(this.ctx.descriptorRegistry.subscribeToDescriptorChanges(this.tag, (_descriptor, newDescriptorWrapper) => { this.onDescriptorWrapperChange(newDescriptorWrapper! as RNC.RNCWebView.DescriptorWrapper) } )) + if (this.descriptorWrapper.props.overScrollMode === 'always') { + this.overScrollMode = OverScrollMode.ALWAYS + } else if (this.descriptorWrapper.props.overScrollMode === 'never') { + this.overScrollMode = OverScrollMode.NEVER + } - this.registerCommandCallback() - } - - private initVariable() { + // this.unregisterDescriptorChangesListener = this.ctx.descriptorRegistry.subscribeToDescriptorChanges(this.tag, + // (newDescriptor) => { + // this.descriptor = (newDescriptor as WebViewViewDescriptor) + // Logger.debug(TAG, `[RNOH] newDescriptor props uri, ${JSON.stringify(this.descriptor.props.newSource.uri)}`); + // this.cacheMode = + // this.descriptor.props.cacheEnabled ? this.transCacheMode(this.descriptor.props.cacheMode) : CacheMode.Online; + // this.javaScriptEnable = this.descriptor.props.javaScriptEnabled; + // this.source = this.descriptor.props.newSource + // if (this.html != "" && this.html != this.source.html) { + // Logger.debug(TAG, "[RNOH] html is update") + // this.html = this.source.html + // if (this.controllerAttached) { + // try { + // this.controller.loadData( + // this.source.html, + // "text/html", + // "UTF-8", + // this.source.baseUrl, + // " " + // ); + // } catch (error) { + // Logger.error(TAG, "error: " + error) + // } + // } + // } else if (this.source.uri != "" && this.url != this.source.uri) { + // Logger.debug(TAG, `[RNOH] newDescriptor props update uri: ` + this.source.uri); + // this.url = this.source.uri + // if (this.controllerAttached) { + // this.controller.loadUrl(this.descriptor.props.newSource.uri) + // } + // } + // }) + // webview.WebviewController.setWebDebuggingAccess(this.descriptor.props.webviewDebuggingEnabled) + this.scrollEnabled = this.descriptorWrapper.props.scrollEnabled; this.javaScriptEnable = this.descriptorWrapper.props.javaScriptEnabled; this.cacheMode = - this.descriptorWrapper.props.cacheEnabled ? this.transCacheMode(this.descriptorWrapper.props.cacheMode as CACHE_MODE) : CacheMode.Online; + this.descriptorWrapper.props.cacheEnabled ? + this.transCacheMode(this.descriptorWrapper.props.cacheMode as CACHE_MODE) : CacheMode.Online; this.source = this.descriptorWrapper.props.newSource this.html = this.source.html if (this.source.uri && this.source.uri.toString().startsWith("asset://")) { this.source.uri = $rawfile(this.source.uri.toString().replace("asset://", this.ctx.rnInstance.getAssetsDest())); } this.url = this.source.uri as string; - - if(this.descriptorWrapper.props.overScrollMode === 'always') { - this.overScrollMode = OverScrollMode.ALWAYS - } else if(this.descriptorWrapper.props.overScrollMode === 'never') { - this.overScrollMode = OverScrollMode.NEVER + // this.nestedScrollFlag = this.descriptor.props.nestedScrollEnabled; + // nestedScrollEnabled true表示可嵌套滚动,不需要自适应和web统一渲染,默认是false + // this.renderMode = this.nestedScrollFlag?RenderMode.ASYNC_RENDER:RenderMode.SYNC_RENDER + this.overScrollMode = this.descriptorWrapper.props.bounces ? OverScrollMode.ALWAYS : OverScrollMode.NEVER + this.registerCommandCallback() + if (this.hasIncognito()) { + this.cacheMode = CacheMode.Online; + webview.WebCookieManager.putAcceptCookieEnabled(false); } - - this.overScrollMode = this.descriptorWrapper.props.bounces ? OverScrollMode.ALWAYS : OverScrollMode.NEVER; + setTimeout(() => { + console.log('descriptorWrapper===>' + JSON.stringify(this.descriptorWrapper.props)) + }, 0) } - private registerPostMessage() { - if (this.messagingEnabled == this.descriptorWrapper.props.messagingEnabled) { - return; - } - this.messagingEnabled = this.descriptorWrapper.props.messagingEnabled; - if (this.messagingEnabled) { - let bridge: RNCWebViewBridge = { - postMessage: (data: string) => { - Logger.debug(TAG, `[RNOH] bridge postMessage, ${JSON.stringify(data)}`); - if (this.controller != null) { - let result: WebViewEventParams = this.createWebViewEvent("onMessage") - result.data = data - result.lockIdentifier = 0 - this.eventEmitter!.emit("message", result as ResultType); - } - } - }; - this.controller.registerJavaScriptProxy(bridge, JAVASCRIPT_INTERFACE, ["postMessage"]) - this.controller.refresh() - this.hasRegisterJavaScriptProxy = true - } + hasIncognito(): boolean { + return this.descriptorWrapper.props.incognito && this.descriptorWrapper.props.incognito === true } createWebViewEvent(param: string): WebViewEventParams { @@ -262,6 +266,9 @@ export struct RNCWebView { this.controller.deleteJavaScriptRegister(JAVASCRIPT_INTERFACE) this.controller.refresh() this.hasRegisterJavaScriptProxy = false + if (this.hasIncognito()) { + this.controller.clearHistory() + } } catch (error) { Logger.error(TAG, `[RNOH]Errorcode: ${error.code}, Message: ${error.message}`); } @@ -432,7 +439,7 @@ export struct RNCWebView { }) } - onHttpError(code: number,description: string) { + onHttpError(code: number, description: string) { this.eventEmitter!.emit('httpError', { url: this.controller.getUrl(), loading: false, @@ -491,8 +498,9 @@ export struct RNCWebView { } build() { + //RNViewBase({ ctx: this.ctx, tag: this.tag }) { Stack() { - Web({ src: this.source.uri || '', controller: this.controller, renderMode: this.renderMode }) + Web({ src: this.source.uri, controller: this.controller, renderMode: this.renderMode }) .width(this.descriptorWrapper.width) .height(this.descriptorWrapper.height) .constraintSize({ minHeight: 1 }) @@ -506,11 +514,26 @@ export struct RNCWebView { .cacheMode(this.cacheMode) .domStorageAccess(this.descriptorWrapper.props.domStorageEnabled) .zoomAccess(this.descriptorWrapper.props.scalesPageToFit)// nestedScrollFlag 为true 表示可以在嵌套滚动中,web自己能滚动 - .overScrollMode(this.overScrollMode) + .overScrollMode(this.overScrollMode)// .layoutMode(this.nestedScrollFlag ? WebLayoutMode.NONE : WebLayoutMode.FIT_CONTENT) + // .userAgent(this.descriptorWrapper.props.userAgent ? this.descriptorWrapper.props.userAgent : + // '')// .nestedScroll(this.nestedScrollFlag ? { + // scrollForward: NestedScrollMode.SELF_ONLY, + // scrollBackward: NestedScrollMode.SELF_ONLY + // } : { scrollForward: NestedScrollMode.PARENT_FIRST, scrollBackward: NestedScrollMode.PARENT_FIRST }) + // .overScrollMode(OverScrollMode.NEVER) + // .onSizeChange((event)=>{ + // Logger.debug(TAG, "[RNOH] event width: " + event.width + "[RNOH] event height: " + event.height) + // }) .onProgressChange((event) => { + console.log('onProgressChangeonProgressChange====>' + JSON.stringify(event)) if (event) { this.progress = event.newProgress - Logger.debug(TAG, "[RNOH] event progress: " + event.newProgress) + this.sendEvent('onLoadProgress', event.newProgress as number) + } + }) + .onScroll((event) => { + if (event) { + this.sendEvent('onScroll', event) } }) .onPageBegin(() => { @@ -526,30 +549,43 @@ export struct RNCWebView { if (event) { let errorInfo: string = event.error.getErrorInfo(); let errorCode: number = event.error.getErrorCode(); - if (!event.request.isMainFrame()) { - Logger.debug(TAG, "[RNOH] ERR_INTERNET_DISCONNECTED:OR ERR_CACHE_MISS") - return - } Logger.debug(TAG, "[RNOH] errorInfo:" + errorInfo) Logger.debug(TAG, "[RNOH] errorCode:" + errorCode) this.onLoadingError(errorCode, errorInfo) } }) .onHttpErrorReceive((event) => { - console.log('onHttpErrorReceiveevent',event) + console.log('onHttpErrorReceiveevent', event) if (event) { let errorInfo: string = event.response.getResponseData(); let code: number = event.response.getResponseCode() - console.log('onHttpErrorReceive',errorInfo) + console.log('onHttpErrorReceive', errorInfo) Logger.debug(TAG, "[RNOH] errorInfo:" + errorInfo) - this.onHttpError(code,errorInfo) + this.onHttpError(code, errorInfo) } }) .onLoadIntercept((event) => { - if (!this.descriptorWrapper.props.shouldStartLoadWithRequestEnabled) { - Logger.debug(TAG, - "[RNOH]:shouldStartLoadWithRequestEnabled:" + this.descriptorWrapper.props.shouldStartLoadWithRequestEnabled) - return false + if (event) { + if (this.onLoadInterceptStatus === ShouldStartLoadWithRequestEnabledStatus.START) { + this.sendEvent('onLoadIntercept', JSON.stringify({ + url: event.data.getRequestUrl(), + loading: this.progress != 100, + title: this.controller.getTitle(), + canGoBack: this.controller.accessBackward(), + canGoForward: this.controller.accessForward(), + lockIdentifier: 11, + navigationType: "other", + mainDocumentURL: "", + isTopFrame: event.data.isMainFrame(), + status: this.onLoadInterceptStatus + })) + this.onLoadInterceptStatus = ShouldStartLoadWithRequestEnabledStatus.END + setTimeout(() => { + if (this.descriptorWrapper.props.shouldStartLoadWithRequestEnabled) { + this.controller.refresh() + } + }) + } } if (this.source.html != undefined && this.source.html != '') { Logger.debug(TAG, "[RNOH]: load html not intercept") @@ -611,10 +647,81 @@ export struct RNCWebView { if (!this.hasRegisterJavaScriptProxy) { this.registerPostMessage() } + if (this.descriptorWrapper.props.userAgent) { + try { + let userAgent = this.controller.getUserAgent() + this.descriptorWrapper.props.userAgent; + this.controller.setCustomUserAgent(userAgent); + } catch (error) { + console.error(`ErrorCode: ${error.code}, Message: ${error.message}, userAgent: ${this.descriptorWrapper.props.userAgent}`); + } + } }) } .width(this.descriptorWrapper.width) .height(this.descriptorWrapper.height) - .position({ x: this.descriptorWrapper.positionRelativeToParent.x, y: this.descriptorWrapper.positionRelativeToParent.y }) + .position({ + x: this.descriptorWrapper.positionRelativeToParent.x, + y: this.descriptorWrapper.positionRelativeToParent.y + }) + } + + private onDescriptorWrapperChange(descriptorWrapper: RNC.RNCWebView.DescriptorWrapper) { + this.descriptorWrapper = descriptorWrapper + + Logger.debug(TAG, `[RNOH] newDescriptor props uri, ${JSON.stringify(this.descriptorWrapper.props.newSource.uri)}`); + this.cacheMode = + this.descriptorWrapper.props.cacheEnabled ? + this.transCacheMode(this.descriptorWrapper.props.cacheMode as CACHE_MODE) : CacheMode.Online; + this.javaScriptEnable = this.descriptorWrapper.props.javaScriptEnabled; + this.source = this.descriptorWrapper.props.newSource + if (this.html != "" && this.html != this.source.html) { + Logger.debug(TAG, "[RNOH] html is update") + this.html = this.source.html + if (this.controllerAttached) { + try { + this.controller.loadData( + this.source.html, + "text/html", + "UTF-8", + this.source.baseUrl, + " " + ); + } catch (error) { + Logger.error(TAG, "error: " + error) + } + } + } else if (this.source.uri != "" && this.url != this.source.uri) { + Logger.debug(TAG, `[RNOH] newDescriptor props update uri: ` + this.source.uri); + this.url = this.source.uri as string; + if (this.controllerAttached) { + this.controller.loadUrl(this.descriptorWrapper.props.newSource.uri) + } + } + if (this.controllerAttached) { + this.controller?.setScrollable(this.descriptorWrapper.props.scrollEnabled) + } + } + + private registerPostMessage() { + if (this.messagingEnabled == this.descriptorWrapper.props.messagingEnabled) { + return; + } + this.messagingEnabled = this.descriptorWrapper.props.messagingEnabled; + if (this.messagingEnabled) { + let bridge: RNCWebViewBridge = { + postMessage: (data: string) => { + Logger.debug(TAG, `[RNOH] bridge postMessage, ${JSON.stringify(data)}`); + if (this.controller != null) { + let result: WebViewEventParams = this.createWebViewEvent("onMessage") + result.data = data + result.lockIdentifier = 0 + this.eventEmitter!.emit("message", result as ResultType); + } + } + }; + this.controller.registerJavaScriptProxy(bridge, JAVASCRIPT_INTERFACE, ["postMessage"]) + this.controller.refresh() + this.hasRegisterJavaScriptProxy = true + } } } \ No newline at end of file