From 243a2fef90dc3ac846a36738bfe97efba3050dc9 Mon Sep 17 00:00:00 2001
From: Allan Sandfeld Jensen <allan.jensen@qt.io>
Date: Thu, 8 Feb 2018 17:31:44 +0100
Subject: [PATCH] Adaptations to form validation
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Form validations messages has moved entirely to being done by Blink.

Change-Id: I6742c111fc59f0baba75b8b37f5d0ec9ae2fb920
Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
Reviewed-by: Michael Brüning <michael.bruning@qt.io>
---
 examples/webengine/customdialogs/WebView.qml  |  24 --
 .../doc/images/customdialogs-validation1.png  | Bin 12523 -> 0 bytes
 .../doc/images/customdialogs-validation2.png  | Bin 12171 -> 0 bytes
 .../customdialogs/doc/src/customdialogs.qdoc  |  54 +----
 examples/webengine/customdialogs/index.html   |   8 -
 src/core/web_contents_adapter_client.h        |   3 -
 src/core/web_contents_delegate_qt.cpp         |  32 ---
 src/core/web_contents_delegate_qt.h           |   3 -
 src/core/web_engine_context.cpp               |   4 -
 .../api/qquickwebenginedialogrequests.cpp     |  33 +--
 src/webengine/api/qquickwebengineview.cpp     |  44 ----
 src/webengine/api/qquickwebengineview_p_p.h   |   4 -
 src/webengine/doc/src/webengineview_lgpl.qdoc |   9 +-
 src/webengine/ui/MessageBubble.qml            | 150 ------------
 src/webengine/ui/ui.pro                       |   2 -
 src/webengine/ui_delegates_manager.cpp        |  34 ---
 src/webengine/ui_delegates_manager.h          |   6 -
 src/webenginewidgets/api/qwebenginepage.cpp   |  25 --
 src/webenginewidgets/api/qwebenginepage_p.h   |   3 -
 src/webenginewidgets/api/qwebengineview.cpp   |   8 -
 .../ui/messagebubblewidget.cpp                | 225 ------------------
 .../ui/messagebubblewidget_p.h                |  91 -------
 src/webenginewidgets/webenginewidgets.pro     |   6 -
 .../qmltests/data/tst_formValidation.qml      | 120 ----------
 tests/auto/quick/qmltests/qmltests.pro        |   1 -
 25 files changed, 13 insertions(+), 876 deletions(-)
 delete mode 100644 examples/webengine/customdialogs/doc/images/customdialogs-validation1.png
 delete mode 100644 examples/webengine/customdialogs/doc/images/customdialogs-validation2.png
 delete mode 100644 src/webengine/ui/MessageBubble.qml
 delete mode 100644 src/webenginewidgets/ui/messagebubblewidget.cpp
 delete mode 100644 src/webenginewidgets/ui/messagebubblewidget_p.h
 delete mode 100644 tests/auto/quick/qmltests/data/tst_formValidation.qml

diff --git a/examples/webengine/customdialogs/WebView.qml b/examples/webengine/customdialogs/WebView.qml
index 0d3fdfacc..0715bc709 100644
--- a/examples/webengine/customdialogs/WebView.qml
+++ b/examples/webengine/customdialogs/WebView.qml
@@ -108,28 +108,4 @@ WebEngineView {
                      properties: {"request": request}});
 
     }
-
-    onFormValidationMessageRequested: function(request) {
-        switch (request.type) {
-        case FormValidationMessageRequest.Show:
-            if (useDefaultDialogs)
-                return;
-
-            request.accepted = true;
-            validationMessage.text = request.text;
-            validationMessage.y = request.anchor.y + request.anchor.height + 10;
-            validationMessage.visible = true;
-            break;
-        case FormValidationMessageRequest.Move:
-            break;
-        case FormValidationMessageRequest.Hide:
-            validationMessage.visible = false;
-            break;
-        }
-    }
-
-    MessageRectangle {
-        id: validationMessage
-        z: 1
-    }
 }
diff --git a/examples/webengine/customdialogs/doc/images/customdialogs-validation1.png b/examples/webengine/customdialogs/doc/images/customdialogs-validation1.png
deleted file mode 100644
index 38fa86235553b6ea9f88e54403efe1580f734fc7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12523
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
TKMKxT+>bR>bd_rqZ9e=j{lM%1

diff --git a/examples/webengine/customdialogs/doc/images/customdialogs-validation2.png b/examples/webengine/customdialogs/doc/images/customdialogs-validation2.png
deleted file mode 100644
index 247d2711b319ab3fa8177edf107f60a45e870a03..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12171
zcmb_?cQhOB+c#~|qFU76v}P!=_oz{7)(m2lP%&B~YPU9}R1spA+B;V5J%ic=wYONM
z_ITs_`#tY@-rw{5`R1H^-`Bja>vQFtBwSll<sl(0Ar21CL)DjxuW@j2kvKSaV(#C?
z?%?~*@?aO|+Uj~r*rl{bl|pc@TFjJM!f%n#9;Jk-mod|tnZMQ2=CrcrbP5(;7cZ(K
zruEC`wNvH|N*44Brwz*%<~9y8f41M;+)zghe`;4?N&8LrZJa52W@2QBHDjLk>nK~+
z!qe;}nlB^tag&S)G;Qb&1AGcSF?RUpprD}O;`*k(zJ6<CJuEEjV1IvSduw-R=k)Ss
zeRX;B@8!kCg;?h7_4Vcc>DA%+b$4g`@BQ<FsRQ}^`MZ>~;93Qqw3%_tnRL!?fsC1z
zrNxDV^S0LJpEcE$6%|~`Xf^~oD(cI|+KPDg9HeID-rc)?om-fb%ah~36|;vH)holl
z26A(Lc(-i?cW<Aao!D6sr;Y9*hIXgXXmWyw-^ce~7BBK={$4)3I6nH*($tWUkl@oQ
zFZg|C5Y;okdt+X7S&TklPn~7|a`m=ujV)nvY-|jl{*6nU0y`mo|HcVh^7PTs(W`=a
z|4+V}rAvK%eaXqmWo2bgbg~zI&&I_>6FtORzqx_duGap!v2WZku2}lHa5Ovn`$f+0
z;XuLS;^Kpyt<Kfs+=;zU?UK%=l3AG<LmL-mGY10$gWtY=^Q#l{aCak=<Wk9-Z(IIL
zz{$uKb;%NO!JN9Wy0%6gIWCtXhfhGdc64#LzuU6>_e&o}mhJw{)qHw-dPrbkT2i8C
z41IzUsliJ^c@o0IeT;85$NQ#r67j%44Yo284}JI_d@KjttY$VX9^IVwEfreHii&w^
zaymMbS%QcdDG5$?7B0}ydKyahITAd+;+i7(bf)}}uRKqsX&Kmv(U&)KgY`Amj5MET
zsl#W~LxJxDXzgqs-rOACT<t7=d+m)neVwy$w)&HTAEZx(FBmxN0I_kcm+Sd^Q?`9$
zT#8|_7h$>wSnAG_fTnks##n%j^b6$)$fXTFaqx3L6^7MG>-yO=%9p!|Nmz1FuyF(y
z)@N0<?Y8<>B-o1vi_xibf!{vC+}vcEaH@al@rJ2oEZziHOu2*<o+GH)qpmw<F^Y+s
zs@UkKaC@z(i*x@mEgKP#;+33%l^YLSJTT<T@l3!A)l(cC0FSDoyq?E2W^#a}jrp;X
z<v}U*jn7RDMdH{iU2=wLOPI_=ktW{*0xYk8f0~~ThE-VcB|YSZyU$X!<xh86Ohh<1
zkG)!y7&v4#kb>z}$V9-vkMnvbQj5%TC$#CZ;_V6D6@R|UvB|$t{V^%0QJMCIH&Ek#
z^=J4jUBw&MQu2U-ahZWxI$Z%TCEcnVguTslVn8aX`fw2_e5k5C+-!O5?KDVpks4hv
zMc&#Z<oaZ^>j~zw_U9a%+8}#tZUgVe#{~xVNuCDPd^U}{_pQgLZ9bL)DAa5^)k^6U
z;-M4$-_HDOcY2D9NRC^Qum0FN(%o<O$XOccx|giJ2YARX()GlN@|!&9*-%D4;Rf5=
zZ);v7D|^hvzY754TjR+h<PRDD-~p{SQ?>p)U|ITTn)LpJNNkbi@#@*ZocEGisY+_9
zsEuJ25E@B%!M^w)UO80<qSBmFPUHszEYWQLEi2n2E3vR|WK63#e{21Gj3C1-`GvBk
z(i@C&TTCC?aI2_xAc_uHP&92_Ro<HMe6h>oy{>p+H7Fai-}>@naB9Tlq+3r}`Sts?
zJTgA93QH!*EGu{40ZrvL=XVfwbV6f!y>`rg+rz!%!6u=2OS*3Qh}6CimX~5=B=zx@
zR-xH2?(JVsrYx!PGi6!sCY|=U@U8@wmE9Q(j|bgca@B9?t!YE<pIrxB58%O6%7?Bn
z1lLJhl=oG$K2^Nw+<dJp=G`|2?Q{6WPnk?1=g?8seWJI{(W)cOLQt&VvRR&K#t(VN
zbGUrQ>NnleruoS-a{Pf3106GS@g2?R`gl@XDlIgWq1*YM*OLXELiuZJJwf^VL0N@3
zlspUvz*dmn*V8{-^<J;gTQCNt96Jtq;(oMgGE{i<JxQB9;itzpC*Sp{TD(Bk<vCSW
z&$KEz1AU9~8r;$66xxsP*=Xam;B&&I2_J;Kl2NICFZvaXi&A*-J2Q{aqHzk8l5Hu;
zsBs8%?G{?ALzzwD9J|y4)PXK?2aXynPvm5(jD8aJlzg%S$;H@L;!w^Yc27amQSld?
zM9P(XX7!O=JV>AVfxjWhF}#4g_e3eQXt-MRQBvta*vrZ1_qzN>qF8z_r7~d7(-3t~
z(kjZKo;MMQQeLpy2<2O9eMzW2=CWddSLOli%8uNfE=Sao^FDgp4@<Z@yNFwN<vd92
z<Z-|9z|p%K6E+zQ#(iH{c1Ob7(s?VSXZ$s->u*Tm{C4;KmKK#|6h2g&)<mN7vo7iL
zv*J4>-MUnvePJC9^QeCFZHlww(^Ik*#&-3XU7EBgMs)%6>}0$Y+QZ+FuEWF6^kEZ3
z?p=&+Nh;xA(pxn%Yu_gqWqlfb(^RkiypX~s0g^Au*jADC^d;*I`G`>=_9Utv;|N%x
zVI<Qt!d|qBs#k9dM}0u(9hcBgLtOe~IH@$Si>UqIkQ%Zm(`wWYB>6&NBy%n%&}BGI
z6>@X87A3>rlHe<`!gt};13r%SEwpoF{hWDCfQY|vza*Y0Cj_721;~HkO9^K3ZVw}V
zIhH|P@bh&556fqLdA1z*g3yBEd&~EbO4WEyNAA|3As+y=60g<U)wgN5fji!K4e>#(
zx88MEmC4m>9#O3)kq3w+;YR%k>;rCQAl3g_-l)K7b~V9=OAB?|ftkuwd_<j!VKW_K
zb#s&pyW^4yM=IWID6@%z_5G@|qs2YCck@Il4Rw~=4jU;w)0RImjPvu)l$R2!Wm&2@
zxLX)6;vO4DpIP-?*Fv5v?CrzGe43x4fZ@m2ch6bji?%h8(t=mjm>(=H{zlEz?(eM8
z^Tr|)f0L+KQ9(=D#v;s$4mH%(vN;apYQ}IaSpnO^J&6d9Mape~BsQDxQ6ExCYp1(U
zF&>iqseVp_@XxfSoRC(8R`%eTs1#60#*Eji!=W$n6F@L$FZsnd(bTF1RS%lc&mL_o
zfMM(fMnj^z3I93@zH4sDH_Y49OhD6rG455iza%y43QHI*&JVsu)#*B7pwHSsyeF)P
z)fnL`F1@{X){Spih1i)<Ne17ClZbr}+{&fDLI{G5`hn@{Xso7c>Mew!&p<1oG=MVt
zsy0$hk4MU;E~wMi)7ZrOd@Y}Us%MgA=#$q?F<#ms_K?I)?d$JaB!oe=BsVF>Sti7*
zbl|%{`o(({{i)?v>BT2+Pz`Tbf8y{gwUhw%GNt)ZB=;8&xlD!uC@CU*qC<amRwvdl
ze}SJlF$^ipDB|uU-}A+MVV3I1aPd|=BM6y^(8C|!S@+&}GozyJ4<CXIc2`2I(sJ`v
zyXSMs-nre)&?Sna{er_W1gyg^0XWf6kz>ggXZ#`Wr$-1u)dU}n*CGISOZSggdc@`Y
z{tPS&G~5t-a8!u#E#BwoL5@9*3_swO@o)Dc*=B+_Zj-TL$%kkB-;x-{K^z|WM?rjj
zMeAkG&%LBjm6t}Iez7x1ZdYUI;`Rb5fpSZ^8V5<8Adzd!GOx&t=mJ_2Yk4wqC75kc
z#q~~VDg9t>dIdpy{_(*^hN1dBDhoVQi1#(43_`*HHc2cafRrAJ`~9SCUH7=Of>@de
zKk$HTu<d>cH)#*2=|lerh7~Bg(2sVr07ls)ZTRH!i@6=DQ+CYB>l%Ble(PZ#_5dOY
zeW$4amvoZ#3PG1@QzoKcx6k<~XyX9z;%8{4iCr3FiVe@n(AKA#<uaQMvo`9DxaS{=
zNPNueh6jcM)m4D}3lvz774d#J?@k!rlv?q|LGeAnzR-4zY|{!|;Qlf*V~knHL>RqE
zMHqx?@_9Oh?lJ{(Eyqpz(ZxNF;q+|F>>?7Uy3sJK-Wxs)G`B^_el>AD>Ra12`Cu9Z
zd*d*M-A%VeDAYi>QBVJSy8cJ@{y)o$E;EK19O8C4;uM7>){9?M%wW^|&=hU{cfs9(
z%Tq{a2ecTSvAZ~$t{I|P&D_}EYkbP<ip1N5R2Ox^QwQN+4lPlyH4@?3N&LL8u5N%F
z-g4{}5Z|x8?o|N2JJtWyFg7)x_31<XHw^nZ92A_2p0F-Rh~dJB1RNH3$8udP-@SWD
zQMOflm~N}eAqxl)+ns8p@L*1hJnDM4VtJ`v_{?z}iE;Rk24Le|9+L<t6^P3G;hPNi
z4Tm2vRYl&Ypv0Qtz6EfB3iNKed-RQEpIB8_IzL2pX-^#Tu@ItuWc+&)4*3B&7JJv{
z>G?V*St{E2H{O9Yqi<g2R+}VYYv|@|^(;+Atm~XLOU>98VAJhcCTg(6QqWplQYNmc
z-^0V4NsX|GlbcnGO!DzbccD@M-br;Bab>?2;&8m$u_kuigymK9N^w!dWNHNBF>%hp
zjD90}?Af2StPkWzm$4*&i5ka3JL6bTNp{xGgdQH1#Lqkpo>0W*hS!k41X(l4>9DVV
zhd2-#7E&s{`7=wV8vJKR*~9C;@}c|`rPtsK!*gk!!kyBQoj;vnfRm4aPoV_)&9IL1
zASn%uJmZ5Q*4V=#r0;LB(jU^=c?_#FU&?~y45y+7=~I^W)0X%~fYzW3XF;#~9v)xo
zKCw;YuGqaX#WA*aVK+8N6ji5zYH6XBKODq$@@_}WGYo%0bL8|-TijukaRPOm$4O~K
zMi8(Z54;l`24<cRRTA6sv*tq_&B-c@j4S)s-K)MXrCNXdvB>h<cuEnzOy$Cl`-rKA
z_#c0f3-aLxotpJ6!Gqyw)c$?*$Y<n(KSs<WuQwO79zJ@y64kgxCt;3h^E7T}M;3v-
z|BB&D`OE^#GV{W)atUo8zi~G7>X%3PmAm>CYTVPIe#f*F%Wfn*+GwN%hQ54x2OY=!
zQ0T|g!~p+mT&^Uj)9VN`N}k3%s?SuPKWiW1dab|Oc;yMSmvD}C&sCj}Hdz<_DTo%A
zoM2os48HW4^}2WW5J0!Gb~y9MsjWo{h3|Q`adqX*&;JYf0&^Wb{CFE6*ujS)W=Ac3
z=|xUiA_4A+fCvWSivGv-zY=KrZL^=VH6Z&fWO#gOEMp<~%Vp<U0wje~mOhc?%jq`g
zWezPWVq7WTKZ#oK#;c>%I+m}`)8|}zk=^Mfbd{$^iK=kvGncC*8i{2TIXme1$arNw
zA~CX13t^3J6Aol2TCc|J-rEC?0v|E*60x8tOK622?14qBjM*25k^D%9-2xh~Kn=Lk
zb!ymvMJ&V>Ut`J|Ju6F)s6fMi{O;xR?f?z=vvr}au6iZ!@+Ntn-!UqF8;s1h3zxRI
z`o;CzOw7pL^N@nSsr+47a@B`sXcan1I+f$XAAFqvq|%LsoW?rN#ty!|qez`Q@BTgC
zDQgfgF+g|jyIn5k$+x5w=D^suCd!zf#}S)Vkyu%QAQg>4;i6HBsmryMf=ce{KFu|l
z{M<~ht>B{%T1=Zu6j5WMFU?qVI&D)j`ZkW$yoa4P2f)VW19eqDK8k96G+#HwXFRD|
zz2~?WEMd7ZYztYR$<d@kTO(fLN6{0y@G+|xS~P0+py_(EO^@{tIt_A$>L<O*&uE1~
z&w0R$URt=hhH|^d5uF?44aTKjka$8h$MPjcOwm~R+Wdgf=P&(BeG3R7y>Y_o2IHFt
zxzX$=7}M`Z+7krCA|UnvXYDvwQWCJgt%B4Guv7<aW6?-oeGP8SjbcRg#1I*Bwmywd
z|DcClk4D22+Qy}{a#^ooJpT2>7q<X<^2@MDliI5?3c444m-K!zfG!I%qu`JQh|>8c
zYUq6e4>D4&zUe4WrL?>7utw<}Y>?w8Bf}_IK&}ip)gMJQ3Ml{u-M^d=67teXIVv??
zT29-QSg$_ddB39l)fHE~?hb{e{(_N+!wkOs$wtD5_$=IL{9;^|QmFZF8s9rRN0TDl
zF2CFAUuOfoYVMfK>3c)tl|d6EsTNiV2K8mU1QZf4{;|^ruOccZ#oj2Fr_37kiqj<G
z<p~cC>=~!v#yJD5&PHc5{>4t=(lEzRr}@{-tF+DG`Xhq_UtB0GpxWm<*2K6u$lN3q
z*20PaF7Z`Djd-MP=7T(AgZOEARiQeFQukaAm!qT-%H^OHd5nv095nB2=Qu@iqOL0)
z&`4-I)@Q;ovV{<e$+<(bJo1Kwol%wTw?j;}k?`O&$cJB0kXoSc#j@r4epchWH?9;Q
z-sL!S3~B#S>jV5a+Uul&p|l~K$>rMLhFiaVd&%sT6D%K{@4vK2ehJwe$6UMQr$V!;
zeD-ZTL`RLBtPMt+o@abKm!EVxHqRsXiQYv!<v(q1Vs86|>@~?b9lCf__<?DK)@bXh
zKGGny%4uTGt782osy45$mQXYvX^e1aVyhvMwZYYw+Pe1<RM!ZtzsO&8XFs&@^f0_$
z=1!#@2c9t*gcf|<3i4N}v8yt7_j71}kPGQJnumms;SqdQGp#QFQoK;`wL-laLUnzJ
z8$Jf1)2IwA#3s~ICQkS(rHeAxvMqXiDr7IRqw}W^Z=rhyI@+5y*a7JvV;M4sP0z!B
zvb#Z^Tm&TYv7NZF^%*M7uhDX7X<HYI9V_b(11V+G`ES9cl)Cct5(_SiJL~4=rPOy$
z&$kav_<Mne2kuwVHG;jsKpAypf5xK(fZ#?O2Z}hR8Py-nL`3A{cbWJU6$!R|T~C5N
zb7%0aCyD)^V*w?;dn(N+@If?O;~PYIylt|?%6P3c3leLMDBs?%+D?gqbd?Bh{$E5g
z^})S-{v!Ami*iIowqCbofgio8y6F2L>SIqLT0hv2XOg4BNyhj|ieDuU&oBfsptFDI
zr#_9;ekz3n7AcD#TamIS8HH~O11{m4uRPL*p@-@Z9?2yzOjUBi9J3od181FFL{&7Y
zCF{|Wt<`p{3T11L)fo&v1Y#s&qyGgPlTAS?4#yM{wqoxIr^s586<(lS-0M&InzHJX
zeRzGvI6N4VgjGJ4^#Z@&>LM35LOQY1mGQ^sVoLmdl<I@SJKgmP4a#gn_E9npNc9cU
z&q3W6;m-3s*C=?!`qW?=bJTlQ_ms}h)W4F*JyC5vKuZn#f9Gvm#e~?B-gm)ie>Q?4
z(vN7D4wbRhL0nTEB_1rh>xJd3GNIvweIeL0DVJ=@!0HrsN}YHUK9XrpqwgTsBW!J%
z=t$vN^yHwB@Z#02PI)xwED_5E>X2!I%#BE;33L2`2gg9Tq!qsId+=0g_a$qRT;#LQ
zYVJAFyd8P+O<09VdG3)k`?vjuc*4{SIG2egBbaN`bF>~5STURY0=c%)&W>WQObL4D
zmcIxNo1njH?Xiqcd>gc<0bOKP{FjO^gW8TF`DRwn#iF_F2P?5kzYJ=5VuGJLN3$*t
z89-3_&>I}anAk4?u|?=#Vfrp?wnWe#BawoU5bP?+((?IdWV3uTi4ev{*OJxkn95^#
zIt8<d1gj9qFufC<dsI!mr-I?Xt)uh?<yJ_5psXKY|LnlZePRkG6dn(@#g0-Q|B$Q$
zr*A1kWB=K#T>K6lh9=q}2%_NwgVgm=B2s$1ULc!)$|V|PHMt0#tQAy+)6{E<S*5^r
zeno;gB-*?a20E%BEvKuC^{_5`n%0?;7go!uPcWtn;ZlFr(at!GPN^&O$$(c-(r*@_
zoHjAM+_~M4x14@BG2E6{*!@>!FR+D>JPBqZGF{wW4e4hv$ikD<H>OY_bbktNXp1q$
zZR$&NCLpV2$~OtcW(BKwXUq%vLA;fXX)4Uqg!6#Z9~(sO){RAO!Q0Y!VXbO*vj@9`
z_)ZKl*0GR)FzvF@%wplnb6QIC>~9r{yAz~XxervW15&Ldc}I?&n^`{UI}ua@hKk!W
zAm7D`in#u(QXV;oQ;1FETXYL9c^Hb*?!P_S5etk@ZPE%2G*L0SkwEPR6+jP&+@W;=
z41Fwhek#A~Hw*Q2kDM4#gaW8cd-U5@%`1mi&EfJIJGB{2ow*}JGLV~>?h5w8`6S4l
zLvEbxi$(4~P@L1SS^BhY>_ctXMDdHDL<ngmz^H7LfosZHC*GB!<n|N`p{v|)YDiky
zQ9bf)a}#Z?#j!8Tdy%R)PZuR)JbuDnKM(=I?>}NDB^~{+{n!BsAf?o)b~yjX(E}<@
z#o?&`z(J<kDt5lWSJ)SgY66GezU+UFgYVpTZ9DBa3GaIRd90FRfhVZb=MeDZg)wyj
z*eH*akdUIXLPtC03u{F@qBXc;D0QY4bc)}Ueo$SLtKle~nk;L6<U_UeMU_v?@am4>
zRWFR;E8l2z4N7*7WCTL%DOab?_DC(k?nmn;P-Ew&@93}92deeI?b#^3N#}8xcAYwm
zp|<4i2&7=U=ay6#tWvW5$qn(Ecd5mv8B?cB9k-XjHO@-X|I5#G^#0w$3Z^O|&M!3l
zV1o<8Oo6*Os1j(9|0c5VJt8HQ+%bDq@5N4w8|ZJ^;M)}TgVy9&*yOK`O%s2(ReowS
zT0-&52&@`|%z$dGs{+N+8l)w%Ei{}){g_|kj*(Pfu*@UBNvG<#$OyznSZFAk?`e#Y
zjKJfEA^yxtUJ}a~e@~<K#rht03rpMP<XJyTb;kMH!`YJdu|ZL9ps~sh{i7vw`#c7V
zcIXaVe`oW@Sj{hFNQE1fj+nHuW$0TUAy4%^%?h@9DaBFYjh1N%nyS%XVS(tXv!z8H
z$(@rf#j?6VIM|>nmwYsIC`6dP2^9cPbZ^9XT&^3t^ly*J-`X~wrm5ck&uK(We~E3W
zM)Zd^fD6>NQf{YZOTxtI_JW%41;AeH)d$kx<F`Q!O<mjj4vK;3-|%S!*nX5h`C-1}
zHC(Z4!I?&ES7qfZ$^&Z~F5SfY(~|McE$6#cg51&5Sf}=|B<#CoYPvMNW2Yjb9bB!!
zypNeioBwdH!_$=%3(=2Hi|SSVCiC;->4BRn)-e<6uG>Y~?sar|3`XGGCEi$X36a!w
zJNid;Dp>MrldiEr55)8)<63^IrsWukdO~>iH+ByRI%VZs&CTrUNSbmhEUm|)W(dW0
zyES82rsdUH#z>+r%5_aGYKk613A)Rm<0TV95Ud+su@S2$R0&mWOEhgsysV4Lt&5Tx
z7=}rW!_?*67|dY|o=I8Trv=-lwE<b%9tGQB0oeKuleIWB{vDmOx-KnTL<>)@87qSt
znMuMBO@8nDJg>gqbSEmo7%aIbVNSJfh%Jc}q#MH-T~=-#NnXkFQP)O(iEdK~+efP-
z{Yg@SKq#qWq7zz(+GNce%Rf-Qs;5r9rvIK5%Eug*`cY@{Kz~wx<W{4O)(m57@bSDO
z2vJFbHG;b>)$?o$M{?<c3zc=!eQbL9<QH#oJ6v<ONqJM^Ssl}E3rQ?P<8$IqVd=>H
z$cdPGChzS!V$I3gdu4(bnN2?eEeiJy95P`o)x^VP=aOZIe90PrS_XlUhwy3mFU$M3
zN+XMZd!F)J8n1tm-Ym_6%{^RVBG2@y1`wr`ST&@iomHvWxmUJmij}u$QX5Hh%g9?x
zr3Lcy`wV6xV-wswqz}g&raYCmjb3qN!IWu=1?#(b{2X!{ucv1BMAR+~*W{|=9%0Im
zBR2}aYz(Q}K=HRUdVjIz<)9Qa^|73NtuC$iY#{%r;$gc|si`8j-E(&oV!0ymdJAFh
z9Y?!vbJ|@Q-Y#BNv9hXohTebIN5bSO?f2PmW5~iiJsV~->Cx$NE>(LYZdnI#A-*fA
zmEEH0S6zVFkC_zAO}0zbeDIIF%wo1X?oEz3?td!uA)(O?W^qH7PN<NG%0b^8n1|8_
z<4~+vQ89g7$uo2TvR%b&uj|6$P-IlX_SujGeIj3dD;NFLSsngV?=ORR2AMxz>CGI9
zuPO&4Ajaz$zqAR@Rn6`97Ij5$$%F5|Z;YI9Hpk0BeKv3i!<j_AWjN6<*hMzF<WrK6
zPI;+si{*6ijq)z@7cZw3)H`Uw7$$XK2|HZlOSFl6_I9^eWv~O)(8X6v$S+}=gkb^l
ze@8&S2JrQPI~GiPu;@tZiA74bhnfj?&>O>?Ql|QPu~H^Ja86xRVM*Zs0M9K67cjvO
zR2-C)VC@1jDcqLf)2yCP>1^S5yqu&=otS==2bQzz|FnsmZYI0MQg{8^WCC|aM0V%D
z9ACs{*Y`UEsCOag7+C?@Tvea_wV;ooRrHLo0tqRLI>7rd!HUDDH1t|?jH$0%&=$o{
zGPi`fuHMfgT@wF|o}Vf_Q4<9c872nG33vfw{F0B5=xYfZ+y2OLWLd1F@EtAqA3X-e
zc4(;(I8;SV`p`al1oIY@vQPqX4;TVUx+dhlO9xZB2fX)#;xQWP6M!bsNNixO_G_v$
z<-|6WRlJAdrPb*%U{NGEr4Nys7&5AAHdUURg&70Ht-dbM+_@DUtYgWReH-lg0`EdB
zg?@-72}%~N^@G!{-Kx1Ul{ZohB>9d$skHhGjQn6q3JM!{Mm0q00mfh7GE{5Z5axij
z)@9JfX8i!)CO0-^FS)n#bJ^&Czhr_Q3_6bl)?x5-y=>N>sxr;WUV5l`T5^0$>eLyR
zpMVw20L3c~Wqx6%+|qKLr8XE>gBiT17ia8W!^HT(A_*^t1}If-%_4;%>anO|9hAA%
zkADkw24U_{;z9`}yzZ+hE{?zNXbL4d@BM!OzN}r9<;)QMf7;Rn<ovum;_!U&qG0>}
zC?~kv5Nu0J4DQwiubYqELe|%RFw~hpk8(I<6Rr_h4r#(7tQfUkL=nmjrOscC5tTd{
z9Z`N9f-7~w!uS>*GU6CC7Z4f(`(EwwGE7NFTRX4zl@?`hm7dnIw$?fBB~Ihnj+9$!
z?@G9RXw*fwr{Nk+qUUH--HN`M)M-R!#&&}un1iq`>M1yv+>K$qC&PHw1{7g}pE!`V
zt`DOY578$l85oXIa8KELVY|DEgVaks`(|a-Nn%Hf#&sxlqt$~=Z}@dM**!)(+abW?
zq;tT{ka!048Qf5p4oQ9&Fs2-%lC7$r8yuofHre>vdaM8ITD`pcw|s1yVwQX`Ko7<}
zr%+<VEg1Ca6(}O>qC&>XJ$p_`_q@<U4@NCe0kD)}k;LGdbfLJl3}79VMWpQo<|k?~
z`GPN!_J;Zfm_f{v)2#v*fuGf)Y5{WNi09(FD$Q$;(P&pCcO!~8`mXeX_AmtGD#=RT
zoi7|CR;doQNh{e3vjdIA6mQ2Vx#LiJEkoiz7eu*%bC(+-2G;8}3ht)HSj9WD{vjQ|
zB>VmbWu>oDSwj9`7^YVLa^%(x%YJTjUkJ*B3p5*J{+Wlub;k2WU5E?QK2+uKzUl{T
z2a74+_8yZk3HiyGAKQxZlg?V+ZmFCb65I-IshUGDsSedigdPGSKWUjX44XB9b8JXx
z9_+90#4h+%0(k!2TNqVg=eNBjyo&F(J?uxSzD2k9q(cfIi-r}(e!}*C@N$SeW1$k`
zf6cg~A7B|Xx+Zi7^&{&==jJ2eMUx*CY(N%8DTkUp03u%3cZjbbN@||<267-u0X1vF
z4uN}4emAb@=m+lYDcZvmLC4%30&i^4g;bO+ul1u6K?bVJ5_NhViHE)x7h<xxfwYzU
zS2d{@-O-W2SNfje2#B-50GZX#=KAO@o0zU1Kg*qAS(Ac3QbE+4^)ZFWVzZU*bEpPy
zL@srgiwULDh+p5eQlzgAG%=N0QjYT1`}-Z0Jx40Ur5^@rF`utysb@8D=lCieX2zho
zZe0Zyi1=F_T9^JE03p;S2JOTGHZpe-7nworG2dF>#-uLWcu7f`r?_?6?2T%nam##?
z)zICS^~#erw=CWw;!Uvz36fi>o?A+&S1EQzyyzdhNscX{W-0Hc2BozQd;lk>Mz`Jy
z`+{}AY{%3?zV})4V6z4sryC#jepSPMxi^%N7?0{SKVv5vra=8+AP=2DMNvR!Jgcs4
zh|s*h^9YlboUl5brA@kFGLA^qQ{@QE;iSIB&w8=V&kv7m@!rX5_kGhfO*Y<%8#JQe
zt@w5uE(s6A%ZoWktvJMVl>DhAf47E+Z+<2vtFW+UBR=#Ei)rfYwopngGVbU{`k{@&
z%2RJht-Pm3gX?-C`T04(0t&ZUsR?^A7+zgJvQU+<QbOHc21a*KKc7qcqH^(57<=n(
zIEWv4uqm<Id`dZ}lDkETHK6rh29UnNbc9o9DY;iyNKc8;^J><;3F`1LA@H0lO-s+G
zB47%!xB3*VlLt>PaKQ2{oPOF<*vC>{1Kz``@9JY#%56##4x9Hfe`5oxNfTPpCnY;%
z!aBx8E6I+AMF1BY1zvMXrPToJ9@P>yyZ_y<gO8x7Z$MOl)EeJy(0)YMTG8S7Q{NBJ
z4%%FBJuzo^@B<zr?)FlW*QoT%wGpGYrKdx74g?V03-3078h8Dfa`RL_>^q$^8}fbk
zOBF>OGbCU~b8c!J!j}&J-kk#>NNREfxgf<sC^2;BqIGegGcvio_xOw9@u&9QAYP(4
zViQVEnreVH&;gX8i1J&v{xz*{`mbM%!~z44Dccq#Itm_gz5aPf@Y97<ar%?-$u*h>
z^uc9FI3(D&gG8o`Cfder5E+UVsK4Nwp+5#!i(~2?T&F&u*UEaqUH5R9LSorF3<K6Z
zX(xptvbHp=Ls5ziCdWu{7p@Qis++zf!?(}uCo1uimT_05$?-QZ+}MD4f+Sdrt{v!e
zeP}6Ws5>fPd)Q(ck~8=-`Pj1|Rf&ChW>2y2rF8bMH<7~kA9t>AE$==e8DU0}kz~VG
zg@<ZYACYCOamCOdpqrw&F6tn^YfEMZb0HdH>&Qv4<g;VFBhk3TJiCkS9Wut{ogN{n
zJohBVz%gAfreCSE!E!k1R~5-5Kjf{S>8TWln*5Lytdj~d2E@|qOwU6SXec-WFIK3m
zG=BV!OJp~&0Ku3G9>&Z@!M{9%9LukA{>2&6(%Ds5;G%pq#NW$~{btXY$@nyFtPBv}
z@u2~$&p98K7Bpg=&^aobEo}7$aj`Cfay$z+u+mhP-Of;nqt)9dc8O7X3vMv@#2)`R
z1o8AGR&Fmf07S_@?bhd|Dga^J;mY-K&`H;#ffB*L<04rSFXBrgxn5A^1uFe*i~GCn
zX?58JW@j+ShQ}A2{z9%55$cl(xWAIKp@pi4ockoGI<^A8MikwXr1b3_3cQy$qp2l*
z2o7<FmpbkuJu=#PQsHA+&M8Lj1!A)7a2;J|VKQf*KzlI*icnSUJdPs->;+2|9!ic6
zN!ImQV`x~^R?^M$lW}muE5Eg{x1o^aSx7Tc&bvUMQ1`W{a%Q}-d;Z0-f?!cQ^5py@
z+T4ARnn0d8EOYJ+$=zax#&9^joC%TEf<c#oJsppv<5<vZZz3KZt4+Kh>RIL@%fJ@m
z%Y?7Q4+NjcCQ~W6-%x;>B?r&h*GOru6IMfBSr51%I2VA<Es&*8s1DqO@Vk8E1g7jH
zA$)h2juUV(@lLD_rub!sb>U^sGz*>~6s)gWuZVdR;Q<#k24NT?%|c>66rSmX`+w(=
z^(29mGe&{$g*8mO9}-rC-_O_1ZAFM>`%|6%JwohWokNZfvdyqBI%x^DrC$e(9Plya
zQfsk^*QY^q-S?br+rs>`Zaoq|pcjRHe$ED!RfpG~+Wk&oEIgalh(2U_X7?RcZAOjm
zkbL|X!)g*;LX}?aPbYj0jpEpTtwQ-XxeMyG*7LInsTm)`OQo0`<685@LD;AvLLmmx
zjSP=WMVVoY1fmM%h_7lE_)Y!kv<Gp&5%oX#M(7*vM3=-#hNo7eipvBiB>BopktuhH
z@8W;c)$e1k(rZ%)DC{KbVDwIV*6bnmK&KkrETn6>q}cbEM_coC6hq}*_=-up4EJ35
zQQsd{vzuvfbp$6Z>9QJ2bm8`c@9$Dwpno?gTk0$nESps=+FfMs%*T%~*vvr8RX`0S
zg{(TS{u)tCl5;;%G=j#4_&)6%|20jR4Cr(BGpgdK!L|9Bbe=g?uWynXZ&;{OgPBoG
z?_&3Vh&r>tJ^3&WUj?GVfTUwGYW{5*{dqp0fQMW#BikSIf5b%~8Jw6gxjsBy_hpMC
zd^x39)YCExaVAiU{$Q;;TGtkl`_v&N-|LK0A&dR(MbnAkIAn|kQ?Es%6dwLFnv?D8
zfS(KE9wlIX6rN>dW`o#5e&>8G5YJ`i{rW+l-UXSVs`gq3DJR3di(Or1Dw(a9N1axE
z3jZQWE^?R<?Xvv^3_G(icUuj3YwC|9%a--B!QVH!p4h=HJ*WRxne^%>kYOMS(096k
zP&?X!boKY1d<A}15Sv?2vcGJnF3_OSy<&tPmQ$3D)A=jgj6#~5J_G4PmksVIHMf1T
zQv~<*hhON0P5+wukPdt!F3WU1luB-#vM}<1_mwVprNO+84cSy#$|K76&(~kD`d4RZ
z^UAuyzbnq-{Ot`~;Us=i0}cc>w#k(6IszZvEUq*XyGaym+*2YsejSqf2O3|>G(|NZ
zvg%{)7!_orE0VzH%?^nwt8}azCzJ_(9VjF%*<~9_bhv+hlYw)gPJQv+*c*0-4u1GR
zc@zgA`wq_gXU7K3I`4#?MEgqS;NpDpf1I}#yfCkqki@*G&cA36n#+R#v*5jv#_WPn
zggWmi%@uattZs9phKe+^Lm21iqM{lls&OBO_;dD=>E+V|2_x0uxkAjJUq<n!pS}wo
z-9&wdxZE*z2cmVe6CBk=viwkqnCuZ$q5~oCg`_ciD7+VY;Vpvxf0?oxPq@$Od!av|
z@MD9a?V~{USJtuOW?j|@2jnX6wmM}2Obe9=h|#ESfDpujcM^x8ZE}y5tQ745_bKL&
zYd?OwxyczcV-uwd8bl&EJ$`8}0UtAY{jA9U{$oBQP8E^h0a4D4Yvj_d-UY#b0OH~d
zWKqgoM9;q1r$Z)9$iB~(jN8%_OY6JGRA@UT*uUtjQ=m!xqIyqY#ON=mEAH<FsDDAd
z1J|nJ>yG!wJ_nkd$XI8WW41epNN2tzWa{A!a+Sv_iY6uer3E0=L4@kJRZOh&F6NS#
zRXp9UC?&$+Mn|)&7okcXGeo`4`aU~SAgf~W=^Gk+S{{WE6q8_N7pDIQM6)2VuMH^>
zsT4vyGApo6WNWh{X2C$<ct_+@S4L!$)Wq5#vqp!!WwyWqX$T&~&1NJrE1p-+Y^!L(
z|2eHy&(<4}RpOD1fzM1+`J>Z|ByAQB2PW~dHg5R#ti<P;0!@4p{#IgHLSf5m*WWem
zL*=Nyj5qp8x!^;-va^2YZ;8Zhu0VUjpOdOTN-Qs#o_;YMS7FC1+9*-X@Wknf!A?XL
z>Bz2*_h5pABZEs>K$(}VI!!i0n6$r@(|7!Zt&K(yaz9wW@S)<eXZbU56Kz@dssmeM
zSxBu%GmjnJurPb%$iB33c|=p0BhIg7r)-|%H|lc9B8!W@*AvIQ&zWeLDmqjubc5l8
lOe{f<74HA5>kzrbHBYSTG;X1Zz5OGws*<K+iGoGI{{c=|1c?9u

diff --git a/examples/webengine/customdialogs/doc/src/customdialogs.qdoc b/examples/webengine/customdialogs/doc/src/customdialogs.qdoc
index df955ee61..ecbe36c78 100644
--- a/examples/webengine/customdialogs/doc/src/customdialogs.qdoc
+++ b/examples/webengine/customdialogs/doc/src/customdialogs.qdoc
@@ -53,7 +53,6 @@
         \li JavaScript Alert, Confirm, and Prompt Dialogs
         \li Color Picker Dialog
         \li File Picker Dialog
-        \li Form Validation Message
     \endlist
 
     \section1 Triggering Dialogs
@@ -103,7 +102,6 @@
         \li JavaScriptDialogRequest
         \li ColorDialogRequest
         \li FileDialogRequest
-        \li FormValidationMessageRequest
     \endlist
 
     \section2 Context Menu Requests
@@ -122,9 +120,8 @@
     \printuntil }
     \printuntil }
     \dots 4
-    \skipuntil onFormValidationMessageRequested
-    \skipuntil }
-    \skipuntil }
+    \skipuntil onFileDialogRequested
+    \skipuntil }});
     \skipuntil }
     \skipto }
     \printline }
@@ -158,9 +155,8 @@
     \printuntil }
     \printuntil }
     \dots 4
-    \skipuntil onFormValidationMessageRequested
-    \skipuntil }
-    \skipuntil }
+    \skipuntil onFileDialogRequested
+    \skipuntil }});
     \skipuntil }
     \skipto }
     \printline }
@@ -200,9 +196,8 @@
     \printuntil }
     \printuntil }
     \dots 4
-    \skipuntil onFormValidationMessageRequested
-    \skipuntil }
-    \skipuntil }
+    \skipuntil onFileDialogRequested
+    \skipuntil }});
     \skipuntil }
     \skipto }
     \printline }
@@ -240,9 +235,8 @@
     \printuntil }
     \printuntil }
     \dots 4
-    \skipuntil onFormValidationMessageRequested
-    \skipuntil }
-    \skipuntil }
+    \skipuntil onFileDialogRequested
+    \skipuntil }});
     \skipuntil }
     \skipto }
     \printline }
@@ -281,13 +275,7 @@
     \skipto onFileDialogRequested
     \printuntil }
     \printuntil }
-    \dots 4
-    \skipuntil onFormValidationMessageRequested
-    \skipuntil }
-    \skipuntil }
-    \skipuntil }
-    \skipto }
-    \printline }
+    \printuntil }
 
     We use the \c onFileDialogRequested signal handler to check whether
     we should use the default color picker dialog. If not, we accept the request
@@ -311,28 +299,4 @@
     file and clicks \c OK, we pass the selected file to the \c dialogAccept
     method.
 
-    \section2  Form Validation Message Requests
-
-    \image customdialogs-validation1.png
-
-    \l [QML]{FormValidationMessageRequest} is a request object that is passed as a
-    parameter of the WebEngineView::formValidationMessageRequested signal:
-
-    \quotefromfile webengine/customdialogs/WebView.qml
-    \skipto WebEngineView
-    \printuntil url
-    \dots 4
-    \skipto onFormValidationMessageRequested
-    \printuntil }
-    \printuntil }
-    \printuntil }
-    \skipto }
-    \printline }
-
-    We use the \c onFormValidationMessageRequested signal handler to check
-    whether we should use the default message bubble. If not, we accept the
-    request and customize \c validationMessage. Depending on the type of the
-    request, we show, move, or hide the message.
-
-    \image customdialogs-validation2.png
 */
diff --git a/examples/webengine/customdialogs/index.html b/examples/webengine/customdialogs/index.html
index 43a2dbb67..490dd79fd 100644
--- a/examples/webengine/customdialogs/index.html
+++ b/examples/webengine/customdialogs/index.html
@@ -38,14 +38,6 @@
                  <td><button class="button" onclick="document.getElementById('filepicker').click()">
                  Open File Dialog</button></td>
              </tr>
-             <tr>
-                <td>
-                    <form><table>
-                        <tr><td><button class="button" type="submit">Open Message Bubble</button></td></tr>
-                        <tr><td><input class="input" placeholder="For this field we open message bubble..." required/></td></tr>
-                    </table></form>
-                </td>
-             </tr>
          </table>
          <input type="color" id="colorpicker" value="#ff0000" style="visibility:hidden"/>
          <input type="file" id="filepicker" accept=".cpp, .html, .h, .png, .qdoc, .qml" style="visibility:hidden"/>
diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h
index 495be3d84..899678e56 100644
--- a/src/core/web_contents_adapter_client.h
+++ b/src/core/web_contents_adapter_client.h
@@ -440,9 +440,6 @@ public:
     virtual void runQuotaPermissionRequest(QSharedPointer<QuotaPermissionController>) = 0;
     virtual void runRegisterProtocolHandlerPermissionRequest(QSharedPointer<RegisterProtocolHandlerPermissionController>) = 0;
     virtual WebEngineSettings *webEngineSettings() const = 0;
-    virtual void showValidationMessage(const QRect &anchor, const QString &mainText, const QString &subText) = 0;
-    virtual void hideValidationMessage() = 0;
-    virtual void moveValidationMessage(const QRect &anchor) = 0;
     RenderProcessTerminationStatus renderProcessExitStatus(int);
     virtual void renderProcessTerminated(RenderProcessTerminationStatus terminationStatus, int exitCode) = 0;
     virtual void requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) = 0;
diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp
index ed406977f..a88f7665e 100644
--- a/src/core/web_contents_delegate_qt.cpp
+++ b/src/core/web_contents_delegate_qt.cpp
@@ -85,16 +85,6 @@
 
 namespace QtWebEngineCore {
 
-static gfx::Rect rootViewToScreenRect(content::WebContents *web_contents, const gfx::Rect &anchor_in_root_view)
-{
-    RenderWidgetHostViewQt *rwhv = static_cast<RenderWidgetHostViewQt *>(web_contents->GetRenderWidgetHostView());
-    if (!rwhv)
-        return gfx::Rect();
-    content::ScreenInfo screenInfo;
-    rwhv->GetScreenInfo(&screenInfo);
-    return gfx::ScaleToEnclosingRect(anchor_in_root_view, 1 / screenInfo.device_scale_factor);
-}
-
 // Maps the LogSeverity defines in base/logging.h to the web engines message levels.
 static WebContentsAdapterClient::JavaScriptConsoleMessageLevel mapToJavascriptConsoleMessageLevel(int32_t messageLevel) {
     if (messageLevel < 1)
@@ -602,28 +592,6 @@ void WebContentsDelegateQt::launchExternalURL(const QUrl &url, ui::PageTransitio
     }
 }
 
-void WebContentsDelegateQt::ShowValidationMessage(content::WebContents *web_contents, const gfx::Rect &anchor_in_root_view, const base::string16 &main_text, const base::string16 &sub_text)
-{
-    gfx::Rect anchor = rootViewToScreenRect(web_contents, anchor_in_root_view);
-    if (anchor.IsEmpty())
-        return;
-    m_viewClient->showValidationMessage(toQt(anchor), toQt(main_text), toQt(sub_text));
-}
-
-void WebContentsDelegateQt::HideValidationMessage(content::WebContents *web_contents)
-{
-    Q_UNUSED(web_contents);
-    m_viewClient->hideValidationMessage();
-}
-
-void WebContentsDelegateQt::MoveValidationMessage(content::WebContents *web_contents, const gfx::Rect &anchor_in_root_view)
-{
-    gfx::Rect anchor = rootViewToScreenRect(web_contents, anchor_in_root_view);
-    if (anchor.IsEmpty())
-        return;
-    m_viewClient->moveValidationMessage(toQt(anchor));
-}
-
 void WebContentsDelegateQt::BeforeUnloadFired(content::WebContents *tab, bool proceed, bool *proceed_to_fire_unload)
 {
     Q_UNUSED(tab);
diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h
index 3dcbf9cd8..2ef87ccd8 100644
--- a/src/core/web_contents_delegate_qt.h
+++ b/src/core/web_contents_delegate_qt.h
@@ -123,9 +123,6 @@ public:
     bool IsPopupOrPanel(const content::WebContents *source) const override;
     void UpdateTargetURL(content::WebContents* source, const GURL& url) override;
     void RequestToLockMouse(content::WebContents *web_contents, bool user_gesture, bool last_unlocked_by_target) override;
-    void ShowValidationMessage(content::WebContents *web_contents, const gfx::Rect &anchor_in_root_view, const base::string16 &main_text, const base::string16 &sub_text) override;
-    void HideValidationMessage(content::WebContents *web_contents) override;
-    void MoveValidationMessage(content::WebContents *web_contents, const gfx::Rect &anchor_in_root_view) override;
     void BeforeUnloadFired(content::WebContents* tab, bool proceed, bool* proceed_to_fire_unload) override;
     bool CheckMediaAccessPermission(content::WebContents *web_contents, const GURL& security_origin, content::MediaStreamType type) override;
     void RegisterProtocolHandler(content::WebContents* web_contents, const std::string& protocol, const GURL& url, bool user_gesture) override;
diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp
index 57248a27f..79584f55d 100644
--- a/src/core/web_engine_context.cpp
+++ b/src/core/web_engine_context.cpp
@@ -383,7 +383,6 @@ WebEngineContext::WebEngineContext()
     // get rid of the warnings.
     parsedCommandLine->AppendSwitch(switches::kDisableES3GLContext);
 #endif
-
     // Needed to allow navigations within pages that were set using setHtml(). One example is
     // tst_QWebEnginePage::acceptNavigationRequest.
     // This is deprecated behavior, and will be removed in a future Chromium version, as per
@@ -394,9 +393,6 @@ WebEngineContext::WebEngineContext()
     // Scroll latching expects phases on all wheel events when it really only makes sense for simulated ones.
     appendToFeatureSwitch(parsedCommandLine, switches::kDisableFeatures, features::kTouchpadAndWheelScrollLatching.name);
 
-    // If the renderer renders the validation messages, we no longer get the callbacks we have in the API.
-    parsedCommandLine->AppendSwitchASCII(switches::kDisableBlinkFeatures, "ValidationBubbleInRenderer");
-
     if (useEmbeddedSwitches) {
         appendToFeatureSwitch(parsedCommandLine, switches::kEnableFeatures, features::kOverlayScrollbar.name);
         if (!parsedCommandLine->HasSwitch(switches::kDisablePinch))
diff --git a/src/webengine/api/qquickwebenginedialogrequests.cpp b/src/webengine/api/qquickwebenginedialogrequests.cpp
index c57f4c76f..b1f52a6b1 100644
--- a/src/webengine/api/qquickwebenginedialogrequests.cpp
+++ b/src/webengine/api/qquickwebenginedialogrequests.cpp
@@ -716,40 +716,11 @@ void QQuickWebEngineFileDialogRequest::dialogReject()
     \instantiates QQuickWebEngineFormValidationMessageRequest
     \inqmlmodule QtWebEngine
     \since QtWebEngine 1.4
+    \obsolete
 
     \brief A request for showing a HTML5 form validation message to the user.
 
-    A FormValidationMessageRequest is passed as an argument of the
-    WebEngineView::formValidationMessageRequested signal. It is generated when
-    the handling of the validation message is requested.
-
-    The \l accepted property of the request indicates whether the request
-    is handled by the user code or the default message should be displayed.
-
-    The following code uses a custom message to handle the request:
-
-    \code
-    WebEngineView {
-        // ...
-        onFormValidationMessageRequested: function(request) {
-            request.accepted = true;
-            switch (request.type) {
-                case FormValidationMessageRequest.Show:
-                    validationMessage.text = request.text;
-                    validationMessage.x = request.x;
-                    validationMessage.y = request.y
-                    validationMessage.visible = true;
-                    break;
-                 case FormValidationMessageRequest.Move:
-                    break;
-                 case FormValidationMessageRequest.Hide:
-                    validationMessage.visible = false;
-                    break;
-                 }
-        }
-        // ...
-    }
-    \endcode
+    No longer used since 5.11, as Blink now renders Validation messages internally.
 */
 
 QQuickWebEngineFormValidationMessageRequest::QQuickWebEngineFormValidationMessageRequest(
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 5e11a1c04..2fe146d4c 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -116,7 +116,6 @@ QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate()
     , m_fullscreenMode(false)
     , isLoading(false)
     , m_activeFocusOnPress(true)
-    , m_validationShowing(false)
     , devicePixelRatio(QGuiApplication::primaryScreen()->devicePixelRatio())
     , m_webChannel(0)
     , m_webChannelWorld(0)
@@ -995,49 +994,6 @@ void QQuickWebEngineViewPrivate::didPrintPageToPdf(const QString &filePath, bool
     Q_EMIT q->pdfPrintingFinished(filePath, success);
 }
 
-void QQuickWebEngineViewPrivate::showValidationMessage(const QRect &anchor, const QString &mainText, const QString &subText)
-{
-    Q_Q(QQuickWebEngineView);
-    QQuickWebEngineFormValidationMessageRequest *request;
-    request = new QQuickWebEngineFormValidationMessageRequest(QQuickWebEngineFormValidationMessageRequest::Show,
-                                                              anchor,mainText,subText);
-    m_validationShowing = true;
-    // mark the object for gc by creating temporary jsvalue
-    qmlEngine(q)->newQObject(request);
-    Q_EMIT q->formValidationMessageRequested(request);
-    if (!request->isAccepted())
-        ui()->showMessageBubble(anchor, mainText, subText);
-}
-
-void QQuickWebEngineViewPrivate::hideValidationMessage()
-{
-    Q_Q(QQuickWebEngineView);
-    // Suppress the initial hide message before any show messages (Since 61-based)
-    if (!m_validationShowing)
-        return;
-    QQuickWebEngineFormValidationMessageRequest *request;
-    request = new QQuickWebEngineFormValidationMessageRequest(QQuickWebEngineFormValidationMessageRequest::Hide);
-    m_validationShowing = false;
-    // mark the object for gc by creating temporary jsvalue
-    qmlEngine(q)->newQObject(request);
-    Q_EMIT q->formValidationMessageRequested(request);
-    if (!request->isAccepted())
-        ui()->hideMessageBubble();
-}
-
-void QQuickWebEngineViewPrivate::moveValidationMessage(const QRect &anchor)
-{
-    Q_Q(QQuickWebEngineView);
-    QQuickWebEngineFormValidationMessageRequest *request;
-    request = new QQuickWebEngineFormValidationMessageRequest(QQuickWebEngineFormValidationMessageRequest::Move,
-                                                          anchor);
-    // mark the object for gc by creating temporary jsvalue
-    qmlEngine(q)->newQObject(request);
-    Q_EMIT q->formValidationMessageRequested(request);
-    if (!request->isAccepted())
-        ui()->moveMessageBubble(anchor);
-}
-
 void QQuickWebEngineViewPrivate::updateScrollPosition(const QPointF &position)
 {
     Q_Q(QQuickWebEngineView);
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index 19cdffdea..4b8617749 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -137,9 +137,6 @@ public:
     QtWebEngineCore::WebEngineSettings *webEngineSettings() const override;
     void allowCertificateError(const QSharedPointer<CertificateErrorController> &errorController) override;
     void runGeolocationPermissionRequest(QUrl const&) override;
-    void showValidationMessage(const QRect &anchor, const QString &mainText, const QString &subText) override;
-    void hideValidationMessage() override;
-    void moveValidationMessage(const QRect &anchor) override;
     void renderProcessTerminated(RenderProcessTerminationStatus terminationStatus, int exitCode) override;
     void requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) override;
     void updateScrollPosition(const QPointF &position) override;
@@ -181,7 +178,6 @@ public:
     bool isLoading;
     bool m_activeFocusOnPress;
     bool m_navigationActionTriggered;
-    bool m_validationShowing;
     qreal devicePixelRatio;
     QMap<quint64, QJSValue> m_callbacks;
     QList<QSharedPointer<CertificateErrorController> > m_certificateErrorControllers;
diff --git a/src/webengine/doc/src/webengineview_lgpl.qdoc b/src/webengine/doc/src/webengineview_lgpl.qdoc
index 761eb2a2c..1621d0821 100644
--- a/src/webengine/doc/src/webengineview_lgpl.qdoc
+++ b/src/webengine/doc/src/webengineview_lgpl.qdoc
@@ -1271,14 +1271,9 @@
 /*!
     \qmlsignal WebEngineView::formValidationMessageRequested(FormValidationMessageRequest request)
     \since QtWebEngine 1.4
+    \obsolete
 
-    This signal is emitted when a validation message is requested.
-
-    The request can be handled by using the methods of the FormValidationMessageRequest
-    type.
-
-    \note Signal handlers need to call \c{request.accepted = true} to prevent a
-    default dialog from showing up.
+    No longer used since 5.11, as Blink now renders Validation messages internally.
 */
 
 /*!
diff --git a/src/webengine/ui/MessageBubble.qml b/src/webengine/ui/MessageBubble.qml
deleted file mode 100644
index 056aac1fe..000000000
--- a/src/webengine/ui/MessageBubble.qml
+++ /dev/null
@@ -1,150 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWebEngine module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.5
-
-Item {
-    id: bubble
-
-    width: 1
-    height: 1
-
-    property int maxWidth: 0
-    property string mainText: ""
-    property string subText: ""
-
-    property int border: 1
-
-    property int arrowWidth: 18
-    property int arrowHeight: 18
-    property int arrowOffset: 18
-
-    property int marginLeft: border + 8
-    property int marginTop: border + arrowHeight + 6
-    property int marginRight: border + 8
-    property int marginBottom: border + 6
-
-    Column {
-        id: messageColumn
-
-        x: bubble.marginLeft
-        y: bubble.marginTop
-        z: 1
-
-        spacing: 5
-
-        Text {
-            id: message
-            width: bubble.maxWidth
-
-            wrapMode: Text.WordWrap
-            elide: Text.ElideNone
-            clip: true
-
-            font.pointSize: subMessage.font.pointSize + 4
-
-            text: bubble.mainText
-        }
-
-        Text {
-            id: subMessage
-            width: bubble.maxWidth
-
-            wrapMode: Text.WordWrap
-            elide: Text.ElideNone
-            clip: true
-
-            text: bubble.subText
-        }
-    }
-
-    Canvas {
-        id: bubbleCanvas
-
-        property int textWidth: Math.min(bubble.maxWidth, Math.max(message.paintedWidth, subMessage.paintedWidth))
-        property int textHeight: message.paintedHeight + (subMessage.paintedWidth > 0 ? (messageColumn.spacing + subMessage.paintedHeight) : 0)
-
-        width: textWidth + bubble.marginLeft + bubble.marginRight
-        height: textHeight + bubble.marginTop + bubble.marginBottom
-
-        property int cornerRadius: 7
-
-        property int messageBoxLeft: 0
-        property int messageBoxTop: bubble.arrowHeight
-        property int messageBoxRight: width - border
-        property int messageBoxBottom: height - border
-
-        onPaint: {
-            var ctx = getContext("2d");
-
-            ctx.lineWidth = bubble.border;
-            ctx.strokeStyle = "#555";
-            ctx.fillStyle = "#ffffe1";
-
-            ctx.beginPath();
-
-            ctx.moveTo(messageBoxLeft + cornerRadius, messageBoxTop);
-
-            // Arrow
-            ctx.lineTo(messageBoxLeft + bubble.arrowOffset, messageBoxTop);
-            ctx.lineTo(messageBoxLeft + bubble.arrowOffset, messageBoxTop - bubble.arrowHeight);
-            ctx.lineTo(messageBoxLeft + bubble.arrowOffset + bubble.arrowWidth, messageBoxTop);
-
-            // Message Box
-            ctx.lineTo(messageBoxRight - cornerRadius, messageBoxTop);
-            ctx.quadraticCurveTo(messageBoxRight, messageBoxTop, messageBoxRight, messageBoxTop + cornerRadius);
-            ctx.lineTo(messageBoxRight, messageBoxBottom - cornerRadius);
-            ctx.quadraticCurveTo(messageBoxRight, messageBoxBottom, messageBoxRight - cornerRadius, messageBoxBottom);
-            ctx.lineTo(messageBoxLeft + cornerRadius, messageBoxBottom);
-            ctx.quadraticCurveTo(messageBoxLeft, messageBoxBottom, messageBoxLeft, messageBoxBottom - cornerRadius);
-            ctx.lineTo(messageBoxLeft, messageBoxTop + cornerRadius);
-            ctx.quadraticCurveTo(messageBoxLeft, messageBoxTop, messageBoxLeft + cornerRadius, messageBoxTop);
-
-            ctx.closePath();
-
-            ctx.fill();
-            ctx.stroke();
-        }
-
-        onPainted: {
-            bubble.width = bubbleCanvas.width;
-            bubble.height = bubbleCanvas.height;
-        }
-    }
-}
diff --git a/src/webengine/ui/ui.pro b/src/webengine/ui/ui.pro
index bce03cc0c..eb6bf435c 100644
--- a/src/webengine/ui/ui.pro
+++ b/src/webengine/ui/ui.pro
@@ -13,8 +13,6 @@ QML_FILES += \
     Menu.qml \
     MenuItem.qml \
     MenuSeparator.qml \
-    # Message Bubble
-    MessageBubble.qml \
     ToolTip.qml
 
 load(qml_module)
diff --git a/src/webengine/ui_delegates_manager.cpp b/src/webengine/ui_delegates_manager.cpp
index 046affbf4..12474a1f1 100644
--- a/src/webengine/ui_delegates_manager.cpp
+++ b/src/webengine/ui_delegates_manager.cpp
@@ -129,7 +129,6 @@ MenuItemHandler::MenuItemHandler(QObject *parent)
 
 UIDelegatesManager::UIDelegatesManager(QQuickWebEngineView *view)
     : m_view(view)
-    , m_messageBubbleItem(0)
     , m_toolTip(nullptr)
     FOR_EACH_COMPONENT_TYPE(COMPONENT_MEMBER_INIT, NO_SEPARATOR)
 {
@@ -535,39 +534,6 @@ void UIDelegatesManager::showMenu(QObject *menu)
     QMetaObject::invokeMethod(menu, "popup");
 }
 
-void UIDelegatesManager::showMessageBubble(const QRect &anchor, const QString &mainText, const QString &subText)
-{
-    if (!ensureComponentLoaded(MessageBubble))
-        return;
-
-    Q_ASSERT(m_messageBubbleItem.isNull());
-
-    QQmlContext *context = qmlContext(m_view);
-    m_messageBubbleItem.reset(qobject_cast<QQuickItem *>(messageBubbleComponent->beginCreate(context)));
-    m_messageBubbleItem->setParentItem(m_view);
-    messageBubbleComponent->completeCreate();
-
-    QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("maxWidth")).write(anchor.size().width());
-    QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("mainText")).write(mainText);
-    QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("subText")).write(subText);
-    QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("x")).write(anchor.x());
-    QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("y")).write(anchor.y() + anchor.size().height());
-}
-
-void UIDelegatesManager::hideMessageBubble()
-{
-    m_messageBubbleItem.reset();
-}
-
-void UIDelegatesManager::moveMessageBubble(const QRect &anchor)
-{
-    if (m_messageBubbleItem.isNull())
-        return;
-
-    QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("x")).write(anchor.x());
-    QQmlProperty(m_messageBubbleItem.data(), QStringLiteral("y")).write(anchor.y() + anchor.size().height());
-}
-
 void UIDelegatesManager::showToolTip(const QString &text)
 {
     if (!ensureComponentLoaded(ToolTip))
diff --git a/src/webengine/ui_delegates_manager.h b/src/webengine/ui_delegates_manager.h
index 54ecf0986..1cbf2ad28 100644
--- a/src/webengine/ui_delegates_manager.h
+++ b/src/webengine/ui_delegates_manager.h
@@ -58,7 +58,6 @@
     F(ConfirmDialog, confirmDialog) SEPARATOR \
     F(PromptDialog, promptDialog) SEPARATOR \
     F(FilePicker, filePicker) SEPARATOR \
-    F(MessageBubble, messageBubble) SEPARATOR \
     F(AuthenticationDialog, authenticationDialog) SEPARATOR \
     F(ToolTip, toolTip) SEPARATOR \
 
@@ -120,17 +119,12 @@ public:
     void showDialog(QSharedPointer<AuthenticationDialogController>);
     void showFilePicker(QSharedPointer<FilePickerController>);
     virtual void showMenu(QObject *menu);
-    void showMessageBubble(const QRect &anchor, const QString &mainText,
-                           const QString &subText);
-    void hideMessageBubble();
-    void moveMessageBubble(const QRect &anchor);
     void showToolTip(const QString &text);
 
 protected:
     bool ensureComponentLoaded(ComponentType);
 
     QQuickWebEngineView *m_view;
-    QScopedPointer<QQuickItem> m_messageBubbleItem;
     QScopedPointer<QObject> m_toolTip;
     QStringList m_importDirs;
 
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 0d5f83bba..30ccf26f2 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -64,10 +64,6 @@
 #include "web_engine_settings.h"
 #include "qwebenginescript.h"
 
-#ifdef QT_UI_DELEGATES
-#include "ui/messagebubblewidget_p.h"
-#endif
-
 #include <QAction>
 #include <QApplication>
 #include <QAuthenticator>
@@ -1604,27 +1600,6 @@ void QWebEnginePagePrivate::javaScriptConsoleMessage(JavaScriptConsoleMessageLev
     q->javaScriptConsoleMessage(static_cast<QWebEnginePage::JavaScriptConsoleMessageLevel>(level), message, lineNumber, sourceID);
 }
 
-void QWebEnginePagePrivate::showValidationMessage(const QRect &anchor, const QString &mainText, const QString &subText)
-{
-#ifdef QT_UI_DELEGATES
-    QtWebEngineWidgetUI::MessageBubbleWidget::showBubble(view, anchor, mainText, subText);
-#endif
-}
-
-void QWebEnginePagePrivate::hideValidationMessage()
-{
-#ifdef QT_UI_DELEGATES
-    QtWebEngineWidgetUI::MessageBubbleWidget::hideBubble();
-#endif
-}
-
-void QWebEnginePagePrivate::moveValidationMessage(const QRect &anchor)
-{
-#ifdef QT_UI_DELEGATES
-    QtWebEngineWidgetUI::MessageBubbleWidget::moveBubble(view, anchor);
-#endif
-}
-
 void QWebEnginePagePrivate::renderProcessTerminated(RenderProcessTerminationStatus terminationStatus,
                                                 int exitCode)
 {
diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h
index 61092fa6a..81caaf415 100644
--- a/src/webenginewidgets/api/qwebenginepage_p.h
+++ b/src/webenginewidgets/api/qwebenginepage_p.h
@@ -134,9 +134,6 @@ public:
     QObject *accessibilityParentObject() override;
     QtWebEngineCore::WebEngineSettings *webEngineSettings() const override;
     void allowCertificateError(const QSharedPointer<CertificateErrorController> &controller) override;
-    void showValidationMessage(const QRect &anchor, const QString &mainText, const QString &subText) override;
-    void hideValidationMessage() override;
-    void moveValidationMessage(const QRect &anchor) override;
     void renderProcessTerminated(RenderProcessTerminationStatus terminationStatus, int exitCode) override;
     void requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) override;
     void updateScrollPosition(const QPointF &position) override;
diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp
index 7ea451fc5..27b0a6017 100644
--- a/src/webenginewidgets/api/qwebengineview.cpp
+++ b/src/webenginewidgets/api/qwebengineview.cpp
@@ -43,10 +43,6 @@
 #include "qwebenginepage_p.h"
 #include "web_contents_adapter.h"
 
-#ifdef QT_UI_DELEGATES
-#include "ui/messagebubblewidget_p.h"
-#endif
-
 #include <QAction>
 #include <QMenu>
 #include <QContextMenuEvent>
@@ -149,10 +145,6 @@ QWebEngineView::~QWebEngineView()
 {
     Q_D(QWebEngineView);
     QWebEngineViewPrivate::bind(0, d->page);
-
-#ifdef QT_UI_DELEGATES
-    QtWebEngineWidgetUI::MessageBubbleWidget::hideBubble();
-#endif
 }
 
 QWebEnginePage* QWebEngineView::page() const
diff --git a/src/webenginewidgets/ui/messagebubblewidget.cpp b/src/webenginewidgets/ui/messagebubblewidget.cpp
deleted file mode 100644
index 70dada0c4..000000000
--- a/src/webenginewidgets/ui/messagebubblewidget.cpp
+++ /dev/null
@@ -1,225 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWebEngine module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "messagebubblewidget_p.h"
-
-#include "api/qwebengineview.h"
-
-#include <qglobal.h>
-#include <QBitmap>
-#include <QHBoxLayout>
-#include <QIcon>
-#include <QLabel>
-#include <QStyle>
-
-namespace QtWebEngineWidgetUI {
-
-Q_GLOBAL_STATIC(MessageBubbleWidget, bubbleInstance)
-
-void MessageBubbleWidget::showBubble(QWebEngineView *view, const QRect &anchor, const QString &mainText, const QString &subText)
-{
-    hideBubble();
-    if (mainText.isEmpty())
-        return;
-
-    bubbleInstance->createBubble(anchor.size().width(), mainText, subText);
-    bubbleInstance->moveToAnchor(view, anchor);
-}
-
-void MessageBubbleWidget::hideBubble()
-{
-    bubbleInstance->hide();
-}
-
-void MessageBubbleWidget::moveBubble(QWebEngineView *view, const QRect &anchor)
-{
-    bubbleInstance->moveToAnchor(view, anchor);
-}
-
-MessageBubbleWidget::MessageBubbleWidget()
-   : QWidget(0, Qt::ToolTip)
-   , m_mainLabel(new QLabel)
-   , m_subLabel(new QLabel)
-{
-    QHBoxLayout *hLayout = new QHBoxLayout;
-    hLayout->setAlignment(Qt::AlignTop);
-    hLayout->setSizeConstraint(QLayout::SetFixedSize);
-    hLayout->setMargin(3);
-
-    const int iconSize = 18;
-    QIcon si = style()->standardIcon(QStyle::SP_MessageBoxWarning);
-
-    if (!si.isNull()) {
-        QLabel *iconLabel = new QLabel(this);
-        iconLabel->setPixmap(si.pixmap(iconSize, iconSize));
-        iconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
-        iconLabel->setMargin(2);
-        hLayout->addWidget(iconLabel, 0, Qt::AlignTop);
-    }
-
-    QVBoxLayout *vLayout = new QVBoxLayout;
-
-    m_mainLabel->installEventFilter(this);
-    m_mainLabel->setWordWrap(true);
-    m_mainLabel->setTextFormat(Qt::PlainText);
-    m_mainLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft);
-    vLayout->addWidget(m_mainLabel.data());
-
-    QFont mainFont = m_mainLabel->font();
-    mainFont.setPointSize(mainFont.pointSize() + 4);
-    m_mainLabel->setFont(mainFont);
-
-    m_subLabel->installEventFilter(this);
-    m_subLabel->setWordWrap(true);
-    m_subLabel->setTextFormat(Qt::PlainText);
-    m_subLabel->setAlignment(Qt::AlignBottom | Qt::AlignLeft);
-    vLayout->addWidget(m_subLabel.data());
-
-    hLayout->addLayout(vLayout);
-    setLayout(hLayout);
-
-    QPalette pal = palette();
-    pal.setColor(QPalette::Window, QColor(0xff, 0xff, 0xe1));
-    pal.setColor(QPalette::WindowText, Qt::black);
-    setPalette(pal);
-}
-
-MessageBubbleWidget::~MessageBubbleWidget()
-{
-}
-
-void MessageBubbleWidget::paintEvent(QPaintEvent *)
-{
-    QPainter painter(this);
-    painter.drawPixmap(rect(), m_pixmap);
-}
-
-void MessageBubbleWidget::createBubble(const int maxWidth, const QString &mainText, const QString &subText)
-{
-    m_mainLabel->setText(mainText);
-    m_mainLabel->setMaximumWidth(maxWidth);
-
-    m_subLabel->setText(subText);
-    m_subLabel->setMaximumWidth(maxWidth);
-    m_subLabel->setVisible(!subText.isEmpty());
-
-    int border = 1;
-    int arrowHeight = 18;
-    bool roundedCorners = true;
-
-#if defined(QT_NO_XSHAPE) && defined(Q_WS_X11)
-    // XShape is required for setting the mask, so we just
-    // draw an ugly square when its not available
-    arrowHeight = 0;
-    roundedCorners = false;
-#endif
-
-    setContentsMargins(border + 3,  border + arrowHeight + 2, border + 3, border + 2);
-    show(); // The widget should be visible for updateGeometry()
-    updateGeometry();
-    m_pixmap = QPixmap(sizeHint());
-
-    QPainterPath path = drawBoxPath(QPoint(0, arrowHeight), border, roundedCorners);
-
-    // Draw border and set background
-    QPainter painter(&m_pixmap);
-    painter.setPen(QPen(palette().color(QPalette::Window).darker(160), border));
-    painter.setBrush(palette().color(QPalette::Window));
-    painter.drawPath(path);
-}
-
-void MessageBubbleWidget::moveToAnchor(QWebEngineView *view, const QRect &anchor)
-{
-    QPoint topLeft = view->mapToGlobal(anchor.topLeft());
-    move(topLeft.x(), topLeft.y() + anchor.height());
-}
-
-QPainterPath MessageBubbleWidget::drawBoxPath(const QPoint &pos, int border, bool roundedCorners)
-{
-    const int arrowHeight = pos.y();
-    const int arrowOffset = 18;
-    const int arrowWidth = 18;
-
-    const int cornerRadius = roundedCorners ? 7 : 0;
-
-    const int messageBoxLeft = pos.x();
-    const int messageBoxTop = arrowHeight;
-    const int messageBoxRight = m_pixmap.width() - 1;
-    const int messageBoxBottom = m_pixmap.height() - 1;
-
-    QPainterPath path;
-    path.moveTo(messageBoxLeft + cornerRadius, messageBoxTop);
-
-    if (arrowHeight) {
-        path.lineTo(messageBoxLeft + arrowOffset, messageBoxTop);
-        path.lineTo(messageBoxLeft + arrowOffset, messageBoxTop - arrowHeight);
-        path.lineTo(messageBoxLeft + arrowOffset + arrowWidth, messageBoxTop);
-    }
-
-    if (roundedCorners) {
-        path.lineTo(messageBoxRight - cornerRadius, messageBoxTop);
-        path.quadTo(messageBoxRight, messageBoxTop, messageBoxRight, messageBoxTop + cornerRadius);
-        path.lineTo(messageBoxRight, messageBoxBottom - cornerRadius);
-        path.quadTo(messageBoxRight, messageBoxBottom, messageBoxRight - cornerRadius, messageBoxBottom);
-        path.lineTo(messageBoxLeft + cornerRadius, messageBoxBottom);
-        path.quadTo(messageBoxLeft, messageBoxBottom, messageBoxLeft, messageBoxBottom - cornerRadius);
-        path.lineTo(messageBoxLeft, messageBoxTop + cornerRadius);
-        path.quadTo(messageBoxLeft, messageBoxTop, messageBoxLeft + cornerRadius, messageBoxTop);
-    } else {
-        path.lineTo(messageBoxRight, messageBoxTop);
-        path.lineTo(messageBoxRight, messageBoxBottom);
-        path.lineTo(messageBoxLeft, messageBoxBottom);
-        path.moveTo(messageBoxLeft, messageBoxTop);
-    }
-
-    // Set mask
-    if (arrowHeight || roundedCorners) {
-        QBitmap bitmap = QBitmap(sizeHint());
-        bitmap.fill(Qt::color0);
-        QPainter painter(&bitmap);
-        painter.setPen(QPen(Qt::color1, border));
-        painter.setBrush(QBrush(Qt::color1));
-        painter.drawPath(path);
-        setMask(bitmap);
-    }
-
-    return path;
-}
-
-} // namespace QtWebEngineWidgetUI
diff --git a/src/webenginewidgets/ui/messagebubblewidget_p.h b/src/webenginewidgets/ui/messagebubblewidget_p.h
deleted file mode 100644
index 6898aea13..000000000
--- a/src/webenginewidgets/ui/messagebubblewidget_p.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWebEngine module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef MESSAGEBUBBLEWIDGET_P_H
-#define MESSAGEBUBBLEWIDGET_P_H
-
-//
-//  W A R N I N G
-//  -------------
-//
-// This file is not part of the Qt API.  It exists purely as an
-// implementation detail.  This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QWidget>
-#include <QPainterPath>
-
-QT_BEGIN_NAMESPACE
-class QLabel;
-class QWebEngineView;
-QT_END_NAMESPACE
-
-namespace QtWebEngineWidgetUI {
-
-class MessageBubbleWidget : public QWidget
-{
-    Q_OBJECT
-public:
-    MessageBubbleWidget();
-    ~MessageBubbleWidget();
-
-    static void showBubble(QWebEngineView *view, const QRect &anchor, const QString &mainText, const QString &subText = QString());
-    static void hideBubble();
-    static void moveBubble(QWebEngineView *view, const QRect &anchor);
-
-protected:
-    void paintEvent(QPaintEvent *) override;
-
-private:
-    void createBubble(const int maxWidth, const QString &mainText, const QString &subText);
-    void moveToAnchor(QWebEngineView *view, const QRect &anchor);
-
-    QPainterPath drawBoxPath(const QPoint &pos, int border, bool roundedCorners);
-
-    QScopedPointer<QLabel> m_mainLabel;
-    QScopedPointer<QLabel> m_subLabel;
-    QPixmap m_pixmap;
-};
-
-} // namespace QtWebEngineWidgetUI
-
-#endif // MESSAGEBUBBLEWIDGET_P_H
diff --git a/src/webenginewidgets/webenginewidgets.pro b/src/webenginewidgets/webenginewidgets.pro
index 540c4d538..a891c062e 100644
--- a/src/webenginewidgets/webenginewidgets.pro
+++ b/src/webenginewidgets/webenginewidgets.pro
@@ -44,12 +44,6 @@ HEADERS = \
         api/qwebengineview_p.h \
         render_widget_host_view_qt_delegate_widget.h
 
-qtConfig(webengine-ui-delegates) {
-    SOURCES += ui/messagebubblewidget.cpp
-    HEADERS += ui/messagebubblewidget_p.h
-    DEFINES += QT_UI_DELEGATES
-}
-
 qtConfig(webengine-spellchecker) {
     DEFINES += ENABLE_SPELLCHECK
 }
diff --git a/tests/auto/quick/qmltests/data/tst_formValidation.qml b/tests/auto/quick/qmltests/data/tst_formValidation.qml
deleted file mode 100644
index 182a2eaa9..000000000
--- a/tests/auto/quick/qmltests/data/tst_formValidation.qml
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtWebEngine module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.0
-import QtTest 1.0
-import QtWebEngine 1.4
-
-TestWebEngineView {
-    id: webEngineView
-    width: 400
-    height: 300
-
-    SignalSpy {
-        id: formValidationMessageRequestSpy
-        target: webEngineView
-        signalName: "formValidationMessageRequested"
-    }
-
-    TestCase {
-        name: "WebEngineViewFormValidation"
-        when: windowShown
-
-        function init() {
-            webEngineView.url = Qt.resolvedUrl("about:blank");
-            verify(webEngineView.waitForLoadSucceeded());
-            formValidationMessageRequestSpy.clear();
-        }
-
-        function test_urlForm() {
-            webEngineView.url = Qt.resolvedUrl("forms.html#url_empty");
-            verify(webEngineView.waitForLoadSucceeded());
-            keyPress(Qt.Key_Enter);
-            formValidationMessageRequestSpy.wait();
-            compare(formValidationMessageRequestSpy.signalArguments[0][0].type, FormValidationMessageRequest.Show);
-            compare(formValidationMessageRequestSpy.signalArguments[0][0].text, "Please fill out this field.");
-
-            webEngineView.url = Qt.resolvedUrl("about:blank");
-            verify(webEngineView.waitForLoadSucceeded());
-            formValidationMessageRequestSpy.wait();
-            compare(formValidationMessageRequestSpy.signalArguments[1][0].type, FormValidationMessageRequest.Hide);
-
-            webEngineView.url = Qt.resolvedUrl("forms.html#url_invalid");
-            verify(webEngineView.waitForLoadSucceeded());
-            keyPress(Qt.Key_Enter);
-            formValidationMessageRequestSpy.wait();
-            compare(formValidationMessageRequestSpy.signalArguments[2][0].type, FormValidationMessageRequest.Show);
-            compare(formValidationMessageRequestSpy.signalArguments[2][0].text, "Please enter a URL.");
-        }
-
-        function test_emailForm() {
-            webEngineView.url = Qt.resolvedUrl("forms.html#email_empty");
-            verify(webEngineView.waitForLoadSucceeded());
-            keyPress(Qt.Key_Enter);
-            formValidationMessageRequestSpy.wait();
-            compare(formValidationMessageRequestSpy.signalArguments[0][0].type, FormValidationMessageRequest.Show);
-            compare(formValidationMessageRequestSpy.signalArguments[0][0].text, "Please fill out this field.");
-
-            webEngineView.url = Qt.resolvedUrl("about:blank");
-            verify(webEngineView.waitForLoadSucceeded());
-            formValidationMessageRequestSpy.wait();
-            compare(formValidationMessageRequestSpy.signalArguments[1][0].type, FormValidationMessageRequest.Hide);
-
-            webEngineView.url = Qt.resolvedUrl("forms.html#email_invalid");
-            verify(webEngineView.waitForLoadSucceeded());
-            keyPress(Qt.Key_Enter);
-            formValidationMessageRequestSpy.wait();
-            compare(formValidationMessageRequestSpy.signalArguments[2][0].type, FormValidationMessageRequest.Show);
-            compare(formValidationMessageRequestSpy.signalArguments[2][0].text, "Please include an '@' in the email address. 'invalid' is missing an '@'.");
-        }
-
-        function test_textForm() {
-            webEngineView.url = Qt.resolvedUrl("forms.html#input_empty");
-            verify(webEngineView.waitForLoadSucceeded());
-            keyPress(Qt.Key_Enter);
-            formValidationMessageRequestSpy.wait();
-            compare(formValidationMessageRequestSpy.signalArguments[0][0].type, FormValidationMessageRequest.Show);
-            compare(formValidationMessageRequestSpy.signalArguments[0][0].text, "Please fill out this field.");
-            // Title should be shown for pattern mismatch only
-            compare(formValidationMessageRequestSpy.signalArguments[0][0].subText, "");
-
-            webEngineView.url = Qt.resolvedUrl("about:blank");
-            verify(webEngineView.waitForLoadSucceeded());
-            formValidationMessageRequestSpy.wait();
-            compare(formValidationMessageRequestSpy.signalArguments[1][0].type, FormValidationMessageRequest.Hide);
-
-            webEngineView.url = Qt.resolvedUrl("forms.html#lorem_ipsum");
-            verify(webEngineView.waitForLoadSucceeded());
-            keyPress(Qt.Key_Enter);
-            formValidationMessageRequestSpy.wait();
-            compare(formValidationMessageRequestSpy.signalArguments[2][0].type, FormValidationMessageRequest.Show);
-            compare(formValidationMessageRequestSpy.signalArguments[2][0].text, "Please match the requested format.");
-            compare(formValidationMessageRequestSpy.signalArguments[2][0].subText, "Should type 'Lorem ipsum'");
-        }
-    }
-}
diff --git a/tests/auto/quick/qmltests/qmltests.pro b/tests/auto/quick/qmltests/qmltests.pro
index 16ecbc1bc..5395da0b5 100644
--- a/tests/auto/quick/qmltests/qmltests.pro
+++ b/tests/auto/quick/qmltests/qmltests.pro
@@ -51,7 +51,6 @@ OTHER_FILES += \
     $$PWD/data/tst_filePicker.qml \
     $$PWD/data/tst_findText.qml \
     $$PWD/data/tst_focusOnNavigation.qml \
-    $$PWD/data/tst_formValidation.qml \
     $$PWD/data/tst_geopermission.qml \
     $$PWD/data/tst_getUserMedia.qml \
     $$PWD/data/tst_inputMethod.qml \
-- 
GitLab