Bug 987718 - Part 6: Hooks up SelectionCaret; r=roc
authorMorris Tseng <mtseng@mozilla.com>
Wed, 04 Jun 2014 22:58:00 +0200
changeset 206054 4d8bd0baf6332ccc5428e657d834a9970e1e127a
parent 206053 533bcb64047560dd81e77932429d0154c1a45880
child 206055 ec751fbe4ebd611c941cd6b4cf9e2a3ad42e39d7
push id3741
push userasasaki@mozilla.com
push dateMon, 21 Jul 2014 20:25:18 +0000
treeherdermozilla-beta@4d6f46f5af68 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersroc
bugs987718
milestone32.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 987718 - Part 6: Hooks up SelectionCaret; r=roc
b2g/app/b2g.js
b2g/chrome/content/content.css
b2g/installer/package-manifest.in
editor/composer/src/moz.build
editor/composer/src/res/text_caret.png
editor/composer/src/res/text_caret@1.5x.png
editor/composer/src/res/text_caret@2.25x.png
editor/composer/src/res/text_caret@2x.png
editor/composer/src/res/text_caret_tilt_left.png
editor/composer/src/res/text_caret_tilt_left@1.5x.png
editor/composer/src/res/text_caret_tilt_left@2.25x.png
editor/composer/src/res/text_caret_tilt_left@2x.png
editor/composer/src/res/text_caret_tilt_right.png
editor/composer/src/res/text_caret_tilt_right@1.5x.png
editor/composer/src/res/text_caret_tilt_right@2.25x.png
editor/composer/src/res/text_caret_tilt_right@2x.png
layout/base/nsDocumentViewer.cpp
layout/base/nsIPresShell.h
layout/base/nsPresShell.cpp
layout/base/nsPresShell.h
layout/generic/nsCanvasFrame.cpp
layout/generic/nsCanvasFrame.h
layout/generic/nsSelection.cpp
layout/style/ua.css
modules/libpref/src/init/all.js
--- a/b2g/app/b2g.js
+++ b/b2g/app/b2g.js
@@ -974,16 +974,19 @@ pref("gfx.canvas.willReadFrequently.enab
 pref("browser.autofocus", false);
 
 // Enable wakelock
 pref("dom.wakelock.enabled", true);
 
 // Disable touch caret by default
 pref("touchcaret.enabled", false);
 
+// Disable selection caret by default
+pref("selectioncaret.enabled", false);
+
 // Enable sync and mozId with Firefox Accounts.
 #ifdef MOZ_SERVICES_FXACCOUNTS
 pref("services.sync.fxaccounts.enabled", true);
 pref("identity.fxaccounts.enabled", true);
 #endif
 
 // Enable mapped array buffer
 pref("dom.mapped_arraybuffer.enabled", true);
--- a/b2g/chrome/content/content.css
+++ b/b2g/chrome/content/content.css
@@ -278,21 +278,19 @@ input[type="checkbox"][disabled]:hover:a
 select[disabled] > button {
   opacity: 0.6;
   padding: 1px 7px 1px 7px;
 }
 
 *:-moz-any-link:active,
 *[role=button]:active,
 button:active,
-input:active,
 option:active,
 select:active,
-label:active,
-textarea:active {
+label:active {
   background-color: rgba(141, 184, 216, 0.5);
 }
 
 input[type=number] > div > div, /* work around bug 946184 */
 input[type=number]::-moz-number-spin-box {
   display: none;
 }
 
--- a/b2g/installer/package-manifest.in
+++ b/b2g/installer/package-manifest.in
@@ -666,16 +666,28 @@
 @BINPATH@/res/table-add-row-before-hover.gif
 @BINPATH@/res/table-add-row-before.gif
 @BINPATH@/res/table-remove-column-active.gif
 @BINPATH@/res/table-remove-column-hover.gif
 @BINPATH@/res/table-remove-column.gif
 @BINPATH@/res/table-remove-row-active.gif
 @BINPATH@/res/table-remove-row-hover.gif
 @BINPATH@/res/table-remove-row.gif
+@BINPATH@/res/text_caret.png
+@BINPATH@/res/text_caret@1.5x.png
+@BINPATH@/res/text_caret@2.25x.png
+@BINPATH@/res/text_caret@2x.png
+@BINPATH@/res/text_caret_tilt_left.png
+@BINPATH@/res/text_caret_tilt_left@1.5x.png
+@BINPATH@/res/text_caret_tilt_left@2.25x.png
+@BINPATH@/res/text_caret_tilt_left@2x.png
+@BINPATH@/res/text_caret_tilt_right.png
+@BINPATH@/res/text_caret_tilt_right@1.5x.png
+@BINPATH@/res/text_caret_tilt_right@2.25x.png
+@BINPATH@/res/text_caret_tilt_right@2x.png
 @BINPATH@/res/text_selection_handle.png
 @BINPATH@/res/text_selection_handle@1.5.png
 @BINPATH@/res/text_selection_handle@2.png
 @BINPATH@/res/grabber.gif
 #ifdef XP_MACOSX
 @BINPATH@/res/cursors/*
 #endif
 @BINPATH@/res/fonts/*
--- a/editor/composer/src/moz.build
+++ b/editor/composer/src/moz.build
@@ -34,12 +34,24 @@ RESOURCE_FILES += [
     'res/table-add-row-before-hover.gif',
     'res/table-add-row-before.gif',
     'res/table-remove-column-active.gif',
     'res/table-remove-column-hover.gif',
     'res/table-remove-column.gif',
     'res/table-remove-row-active.gif',
     'res/table-remove-row-hover.gif',
     'res/table-remove-row.gif',
+    'res/text_caret.png',
+    'res/text_caret@1.5x.png',
+    'res/text_caret@2.25x.png',
+    'res/text_caret@2x.png',
+    'res/text_caret_tilt_left.png',
+    'res/text_caret_tilt_left@1.5x.png',
+    'res/text_caret_tilt_left@2.25x.png',
+    'res/text_caret_tilt_left@2x.png',
+    'res/text_caret_tilt_right.png',
+    'res/text_caret_tilt_right@1.5x.png',
+    'res/text_caret_tilt_right@2.25x.png',
+    'res/text_caret_tilt_right@2x.png',
     'res/text_selection_handle.png',
     'res/text_selection_handle@1.5.png',
     'res/text_selection_handle@2.png',
 ]
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..167cb6526ce7b354b9a395df1c8b2d9e99918f30
GIT binary patch
literal 1652
zc%17D@N?(olHy`uVBq!ia0vp^qChOg!3HEF9L1f1lw^r(L`iUdT1k0gQ7VIDN`6wR
zf@f}GdTLN=VoGJ<$y6H#24<Dakcg59UmvUF{9L_6kQ%*;+yVv=u(7WwNKDR7Em25H
zP0!4;ReHaBzmh^`img((sjq==fpcm`rbks#YH*cbNODznvSo^ry`6$hg%!|%+|-gp
zg^Jvqyke^gTP3i$RzNmLSYJs2tfVB{Rte&$2;Tq&=lr5n1yem^-DCqpLj^N4Jwp>y
zGc!XS1tSAPBYguPGSf9Qu`)HYGBQ_y0wthrMJZ`kK`w4kyMR1frHqo20xNy}^73-M
za$~*xqI7*jOG`_T8Ae9BKoz>hm3bwJ6}oxF$}kgLQj3#|G7CyF^Yauy{KTaE(h^%G
zC72g-3*g4)6+?pw7-0Gpi3R$GdItJP3VnU?E6vS?t1d1HN=?JBx;Uh=AXPsowK%`D
zC>a=WY04nY1y;^Qsfi`|MIrh5Ij~R+$jC3rFV4s>P;d@5Q_%2DOwP;$321_K`1)FT
z<`tJD<|U_ky4WfKMf5T=Q><K!Ok9jD-JD%449pD;U5zcBO$=R44S_r(Q&S^HSD0Rx
z{N&Qy)Vvay-V}sh7o2)Qi2<TJwJ5VJHN~wcKUV?lX{$`!ZgIrz7Kq*y+-`BgsaGH9
z7=5&;h6w@F4~Pj*xIhj(>8Iua(|ZvxVNdLmN?~ANdgkfk7*cU7=}PR+8I1xvWb{ri
z+52MIyUCeH!=G?1|L;2aaKL$&p2n=&-?1}q?9}r(c2$+>=b4r-0wy9H77;&MPCN3X
z<?X9cIO;iZp+dNp>6*gCXQCwx+Rq+b3w(QXvd@XFJ{3GEQ@nDfJqWorpW}(qp(8h!
zPLY1noxZy9N#V;>F@D`cS|9&k=Z_OSf27n$Cg#_PM?F41GHVtY<;h&q%Fdg<vsU%g
zQU&oEtF6vHIu`Zp!s`99VZJ#stNw`HV{dR=-1LTfO<U8UfUV{0IoD789GUPV@*%gm
zTUeQ?Ug>1vSCjj8ES`P1C1-)xZL#Ds&!uyFbk-QTEa6HBFyP+Ud2$`Qnk9eA<_A2E
z?E!Xtmc6MxXLOo)mN2-f@tJY9x*EN_yJ^FMgr;4STy-?;*<YxNvKcX4P&{Pw>zk>A
zn)W8|oe?ZYCP`{A=rApMxTnp}DZyFs<wno$&bh&jLe7oro{E0+VOlDdHo<%5O%;)?
zk}DV*Zc3!^X`cuXO9&EQ(6*50|G$roXP6~V{rLTL^7bnRpU*!pe}C{LW6Hnh-tF%j
zi`163{i`XGPB~{kVPU=9+*|+NeE&UtyXL2#-}Uq3*UqgFJn@IOOjDr#XHD7nC@-GB
zMQ?vRtGC}@%V0T)Gh%MTp1(g|zByHDKmY!Im#~PsioZWzewoDT@XUS2cgF|p0`|36
zrr-PW{O{`JOC)}Lf4%&>f7+BQ%*vc1^X@;e<a!YmkoxW2@x`yj-<h$9|E(x_tYpac
zuj=QEcg=k}CY^u&U6#4%euGSJkjMV0%luro^XvE5{P>gi{ZVmGkI(x^mZPl^6+c)d
zB_st?pZ)*;zkYw^uNQ|OZhb9Rrsl)2={&RRe1}@@ld&g4O}2C~h;l8k(P2HbM(NU|
zJ#2hjXKa}6?7wgG`^VpVOP|}%zgx>Ug*h=Gpz+cV|0gOZJJ#N756h8pIKzB&fz%Yq
zSGE(n9j=}bSNO-r71mSK5Mas3Tb`!zmp|)-ea%c(g#!!+KmK{XUNcS}R1bK%`njxg
HN@xNA6J~-V
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8b2ec905aae4474fb2507831b0774ba1d6900bca
GIT binary patch
literal 1930
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..dae08f27565737d34420b9962cc1031e1e5e6936
GIT binary patch
literal 2468
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
G6Z1DA8zXN3
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f3151a37a7910a5a2c630ac447c1ce7df03f5d50
GIT binary patch
literal 2524
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9250b816288d13725a21da76d8c99f72d6f0c47a
GIT binary patch
literal 1567
zc%17D@N?(olHy`uVBq!ia0vp^Vn8g#!3HEZm#uLCQj#UE5hcO-X(i=}MX3yqDfvmM
z3ZA)%>8U}fi7AzZCsS=07?@QuLn2Bde0{8v^K<nQL2C3Watjzhz{b9!ATc>RwL~E)
zH9a%WR_Xoj{Yna%DYi=CroINg1<t7%nI2U|slio#A<0$Q$(AWf_I3(36;?n4a#KqZ
z6)JLb@`|l0Y?Z*~S^?Q0VSOb9u#%E&TP292B76fBob!uP6-@Pvb(0MY4HeAH^bAc*
z&CCpS6pRcEjr0wG$V}JJ#LCpn%E(*+3Y37h6{VzE1-ZCE?E>;_l`=|73as??%gf94
z%8m8%i_-NCEiElUW*8ai0#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH*@e`BsOG|8(
zlwe-SEr1)FR}2j%V1VgYBo^o!>KW)GDfIQluQWFouDZA+C^Zeg>f(^ff>iyW)Z+Zo
zqGVvir743n7g#wLr6!i-7lq{K=fFZSAS1sdzc?emK*2fKOhLmpF*!32B%le_;p=PV
znO9trn3tUD>0+w{6w%AfOtEsaFf}x@urPJ8FfcbXbTzhgHZgQHH3agEOihg(U154%
z@{>z*Q}aq-dQ%X3&2Z`kB?gG@)S}F?)D*X({9FaFr>!z^yTur{TOfK<aJ$6>r(S)a
zWAxFY8YToxKOiPN;Q~4Eq@S7xOz%a&gq^bQxc~zL(?m}f$B>F!NmpWj&S(@Wu#6Eq
zmU3lIap0r>>*veorOf=BpyZ_d`2F_tOaIr@rT_W<x%#Yp|GMJlBMwFDuYEDj^s!#L
z%JR3<rf-X)XGd1B$Qu?Glrt`kh$xU;c5S!+w9tr6G3hsJ<=xW6EN93VuUBY(*X4d+
z;@|(@x?(X0P98XMqHWFh(@&kJH;PDei#bPbc^0FU^h_{=CF{|FSG;a+dJ2t-f8Iae
z-tWImbS|S|<OQD8tFy{WrHswvxhx<4{e5<`_W!!NdiIomNls-ek8PPO`b3J0sorki
zKISF+7(d3VMa=M0H9NVPqbodMl2gOFTFxTf4&Guz?fDzC?UaR$#a%P|Cvv8|h)-#@
zY@GP?tb=00vqw)GH_mi8cp&?M#-Sr87kg|xXv1V=aJ-4bO)u2hlP%|E`;`d^sp3pC
z`OSa4K6^P{Vg<v$|3CkV-#q$%e~i_ipa0*-i%9=_{`Yjd!siEU&67^7pU!_iFzdr~
z?{>cCPn<Ur5?-<y{rJ7y*xEek$*ul;xqVUgl23NbKXLNy>+Yv>tLyFdm(RQNpmuxt
zPaTE7eD9K0u$-7C-v7%e>VMteA8jGQ_VE@QUOqjw?ybW!_W-sQX&xRvf#=K{*6jUJ
z;Z<jPA^Lo0@$>)x=bw9b@5ch$ZTu&guS(p1D9Pd}sbOvRyC(1b!P}{MKjr;%?*4dx
zy+41)85Xy1bJIU(N6VL~er4LZ-GQ%pr`Vij6IZKcoMq5zKH3n`H*<Ep-wD-QGrZ46
z$j(^J((v-j_xI-h@ii8^KI#~-#<cJH#A(9uZ$XOK7c2fO3ytp$pY}3{d}cDVzT$d+
z0oz{oNB$0fm~Sq%;C0)~lESEcB_J(h)_-2!ZTA-}=?a<I$0VaFYoK}QNJ0YxGsFK>
VUd7;d6Ieh+wx_F~%Q~loCIGsqS%Lrn
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9837cbd0feb5350f07f24bc902ef24c879058555
GIT binary patch
literal 2004
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
a0K?kn&*!Yl%3c7fXFXm0T-G@yGywq9?kt%A
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a76c610008827d78cd01f125f2e8438309f366d7
GIT binary patch
literal 2322
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
Uaf0mC>W_aZ94|js88bZXKa%&mG5`Po
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..5ca79fc8738617127e44d306b42dfb692d19a8b2
GIT binary patch
literal 2411
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
K)ap$;)Bgh#FXoW|
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..965c749d2c36377e448a7729862ea1037228038c
GIT binary patch
literal 1565
zc%17D@N?(olHy`uVBq!ia0vp^Vn8g#!3HEZm#uLCQj#UE5hcO-X(i=}MX3yqDfvmM
z3ZA)%>8U}fi7AzZCsS=07?@QuLn2Bde0{8v^K<nQL2C3Watjzhz{b9!ATc>RwL~E)
zH9a%WR_Xoj{Yna%DYi=CroINg1<t7%nI2U|slio#A<0$Q$(AWf_I3(36;?n4a#KqZ
z6)JLb@`|l0Y?Z*~S^?Q0VSOb9u#%E&TP292B76fBob!uP6-@Pvb(0MY4HeAH^bAc*
z&CCpS6pRcEjr0wG$V}JJ#LCpn%E(*+3Y37h6{VzE1-ZCE?E>;_l`=|73as??%gf94
z%8m8%i_-NCEiElUW*8ai0#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH*@e`BsOG|8(
zlwe-SEr1)FR}2j%V1VgYBo^o!>KW)GDfIQluQWFouDZA+C^Zeg>f(^ff>iyW)Z+Zo
zqGVvir743n7g#wLr6!i-7lq{K=fFZSAS1sdzc?emK*2fKOhLmpF*!32B%le_;p=PV
znO9trn3tUD>0+w{6w%AfOtG>waxyS5a5HzYFt9K*bTzhgHZgQHHMB4=H!?Lfa&(31
zb;(aI%}vcKf$2>_=(WJ97nB$vx>JiX%TiO^it=+6z@E0s#NrlHa~DekOD7ZDZh`1c
z!R;0^oO<<vj?qVpYM2l({eYP8gbU=rlYVL*FufN66L$agy*C*cnEE|k978H@C8Z=J
zBwU$M*3~?*H}*kQ*FWyNQ~UoLPhik%Kb<6+&Xgpk#`jK7Ozxojt?s<sf1h9GetN(C
zd}#dIm+4JeDStk`u=;-g{Cm^?HFfDsQzo-@3T_fu(h$9_z>Q~r>vtZJng9RSGj_gr
zP}Sk->A9m3RR7=R*Z<eYr`>-aS8`XYsD?%8P?~|dvT=9YwLhzW&$zLZ#e<V=!BhKx
zbw2~@bzRr<pZMJ@Ct}~ISMmS%+0CnYmN2=w@ukHb^jljQzO3-Xij4~;czV{<JN&vm
zzkhwc@dVBpJAVd?W=#uic*K44sKSTW_t(qoOKLFa{84%ubaE}%g$J$Df5cDx_w78`
z<8vlv4_jZWgPQiHgFFt2a%^0T-0K&xPk7{HHluT<yF*)0^Gu6Mk;;<X)&p`4mNO<!
zjqPYGI&flbqE>5;!R7z<`~L?WOlZ@;?pNbx_T&Hj@A~pVSug(I-@mVBZ`B*_4o>4A
z-=}-G^95&pSU;Wre4|E6bN#+3`=58__vdRAeO+#BZO*jvy@np!qw@FP^yas&bx>sc
zQ&ac;PxsTg)s1J?e|W-n_L_YBx;MA}{d{!r>=LP8-(Md$@Bd{K)p$l+!8*W*;|h1b
z{Fb9%>TEWq@@{zY%e`mefd|$9DuVJ%H=NnW@uZF+X@i~Hg6xUe%mIo@JV#a?$}7xM
zvdf&9^XQY-4IY+hy7%qo-`@TE=AT<j>+SaJV<{5RsWIenGnymcv9vLw&;7h#@PS+R
zXN0;$HBD@tDjM;x?nl|{H)qSMr_Ez!V_Y$T{b9JnA7;xs1D-Z1J}xCbg=fr3jw@Va
zHhhxquy@|ednjI^RU&IivZ=&LCbx{tqijnh7q&I<{O7&$TRc3~ic28z4={bqlHd_Y
ZVA!6|`A(sA(|k~Y?dj_0vd$@?2>=2lR|)_C
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..9018291b5c543ac9adc1655227d0e5ee7d4e6f67
GIT binary patch
literal 2031
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..83f4b931d7ecf1e8a7b8456f1b1031531b668354
GIT binary patch
literal 2345
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ecb4c54e9c69d1abadbfddeb2195cf9837ef803b
GIT binary patch
literal 2443
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
--- a/layout/base/nsDocumentViewer.cpp
+++ b/layout/base/nsDocumentViewer.cpp
@@ -76,16 +76,17 @@
 
 #include "nsIScrollableFrame.h"
 #include "nsStyleSheetService.h"
 #include "nsRenderingContext.h"
 #include "nsILoadContext.h"
 
 #include "nsIPrompt.h"
 #include "imgIContainer.h" // image animation mode constants
+#include "SelectionCarets.h"
 
 //--------------------------
 // Printing Include
 //---------------------------
 #ifdef NS_PRINTING
 
 #include "nsIWebBrowserPrint.h"
 
@@ -715,16 +716,24 @@ nsDocumentViewer::InitPresentationStuff(
   rv = GetDocumentSelection(getter_AddRefs(selection));
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsISelectionPrivate> selPrivate(do_QueryInterface(selection));
   rv = selPrivate->AddSelectionListener(mSelectionListener);
   if (NS_FAILED(rv))
     return rv;
 
+  nsRefPtr<SelectionCarets> selectionCaret = mPresShell->GetSelectionCarets();
+  if (selectionCaret) {
+    nsCOMPtr<nsIDocShell> docShell(mContainer);
+    if (docShell) {
+      docShell->AddWeakScrollObserver(selectionCaret);
+    }
+  }
+
   // Save old listener so we can unregister it
   nsRefPtr<nsDocViewerFocusListener> oldFocusListener = mFocusListener;
 
   // focus listener
   //
   // now register ourselves as a focus listener, so that we get called
   // when the focus changes in the window
   nsDocViewerFocusListener *focusListener = new nsDocViewerFocusListener();
@@ -4411,16 +4420,24 @@ nsDocumentViewer::DestroyPresShell()
   mPresShell->EndObservingDocument();
 
   nsCOMPtr<nsISelection> selection;
   GetDocumentSelection(getter_AddRefs(selection));
   nsCOMPtr<nsISelectionPrivate> selPrivate = do_QueryInterface(selection);
   if (selPrivate && mSelectionListener)
     selPrivate->RemoveSelectionListener(mSelectionListener);
 
+  nsRefPtr<SelectionCarets> selectionCaret = mPresShell->GetSelectionCarets();
+  if (selectionCaret) {
+    nsCOMPtr<nsIDocShell> docShell(mContainer);
+    if (docShell) {
+      docShell->RemoveWeakScrollObserver(selectionCaret);
+    }
+  }
+
   nsAutoScriptBlocker scriptBlocker;
   mPresShell->Destroy();
   mPresShell = nullptr;
 }
 
 void
 nsDocumentViewer::DestroyPresContext()
 {
--- a/layout/base/nsIPresShell.h
+++ b/layout/base/nsIPresShell.h
@@ -53,16 +53,17 @@ class nsViewManager;
 class nsView;
 class nsRenderingContext;
 class nsIPageSequenceFrame;
 class nsCanvasFrame;
 class nsAString;
 class nsCaret;
 namespace mozilla {
 class TouchCaret;
+class SelectionCarets;
 } // namespace mozilla
 class nsFrameSelection;
 class nsFrameManager;
 class nsILayoutHistoryState;
 class nsIReflowCallback;
 class nsIDOMNode;
 class nsIntRegion;
 class nsIStyleSheet;
@@ -762,16 +763,31 @@ public:
   virtual void SetMayHaveTouchCaret(bool aSet) = 0;
 
   /**
    * Get the mMayHaveTouchCaret flag.
    */
   virtual bool MayHaveTouchCaret() = 0;
 
   /**
+   * Get the selection caret, if it exists. AddRefs it.
+   */
+  virtual NS_HIDDEN_(already_AddRefed<mozilla::SelectionCarets>) GetSelectionCarets() const = 0;
+
+  /**
+   * Returns the start part of selection caret element of the presshell.
+   */
+  virtual NS_HIDDEN_(mozilla::dom::Element*) GetSelectionCaretsStartElement() const = 0;
+
+  /**
+   * Returns the end part of selection caret element of the presshell.
+   */
+  virtual NS_HIDDEN_(mozilla::dom::Element*) GetSelectionCaretsEndElement() const = 0;
+
+  /**
    * Get the caret, if it exists. AddRefs it.
    */
   virtual already_AddRefed<nsCaret> GetCaret() const = 0;
 
   /**
    * Invalidate the caret's current position if it's outside of its frame's
    * boundaries. This function is useful if you're batching selection
    * notifications and might remove the caret's frame out from under it.
--- a/layout/base/nsPresShell.cpp
+++ b/layout/base/nsPresShell.cpp
@@ -71,16 +71,17 @@
 #include "nsIDOMElement.h"
 #include "nsRange.h"
 #include "nsCOMPtr.h"
 #include "nsAutoPtr.h"
 #include "nsReadableUtils.h"
 #include "nsIPageSequenceFrame.h"
 #include "nsCaret.h"
 #include "TouchCaret.h"
+#include "SelectionCarets.h"
 #include "nsIDOMHTMLDocument.h"
 #include "nsFrameManager.h"
 #include "nsXPCOM.h"
 #include "nsILayoutHistoryState.h"
 #include "nsILineIterator.h" // for ScrollContentIntoView
 #include "pldhash.h"
 #include "mozilla/dom/Touch.h"
 #include "mozilla/dom/PointerEventBinding.h"
@@ -698,28 +699,40 @@ nsIPresShell::FrameSelection()
 }
 
 //----------------------------------------------------------------------
 
 static bool sSynthMouseMove = true;
 static uint32_t sNextPresShellId;
 static bool sPointerEventEnabled = true;
 static bool sTouchCaretEnabled = false;
+static bool sSelectionCaretEnabled = false;
 
 /* static */ bool
 PresShell::TouchCaretPrefEnabled()
 {
   static bool initialized = false;
   if (!initialized) {
     Preferences::AddBoolVarCache(&sTouchCaretEnabled, "touchcaret.enabled");
     initialized = true;
   }
   return sTouchCaretEnabled;
 }
 
+/* static */ bool
+PresShell::SelectionCaretPrefEnabled()
+{
+  static bool initialized = false;
+  if (!initialized) {
+    Preferences::AddBoolVarCache(&sSelectionCaretEnabled, "selectioncaret.enabled");
+    initialized = true;
+  }
+  return sSelectionCaretEnabled;
+}
+
 PresShell::PresShell()
   : mMouseLocation(NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE)
 {
   mSelection = nullptr;
 #ifdef MOZ_REFLOW_PERF
   mReflowCountMgr = new ReflowCountMgr();
   mReflowCountMgr->SetPresContext(mPresContext);
   mReflowCountMgr->SetPresShell(this);
@@ -864,16 +877,22 @@ PresShell::Init(nsIDocument* aDocument,
   // before creating any frames.
   SetPreferenceStyleRules(false);
 
   if (TouchCaretPrefEnabled()) {
     // Create touch caret handle
     mTouchCaret = new TouchCaret(this);
   }
 
+  if (SelectionCaretPrefEnabled()) {
+    // Create selection caret handle
+    mSelectionCarets = new SelectionCarets(this);
+  }
+
+
   NS_ADDREF(mSelection = new nsFrameSelection());
 
   mSelection->Init(this, nullptr);
 
   // Important: this has to happen after the selection has been set up
 #ifdef SHOW_CARET
   // make the caret
   mCaret = new nsCaret();
@@ -1125,16 +1144,21 @@ PresShell::Destroy()
     mSelection->DisconnectFromPresShell();
   }
 
   if (mTouchCaret) {
     mTouchCaret->Terminate();
     mTouchCaret = nullptr;
   }
 
+  if (mSelectionCarets) {
+    mSelectionCarets->Terminate();
+    mSelectionCarets = nullptr;
+  }
+
   // release our pref style sheet, if we have one still
   ClearPreferenceStyleRules();
 
   mIsDestroying = true;
 
   // We can't release all the event content in
   // mCurrentEventContentStack here since there might be code on the
   // stack that will release the event content too. Double release
@@ -2159,16 +2183,22 @@ already_AddRefed<nsCaret> PresShell::Get
 
 // TouchCaret
 already_AddRefed<TouchCaret> PresShell::GetTouchCaret() const
 {
   nsRefPtr<TouchCaret> touchCaret = mTouchCaret;
   return touchCaret.forget();
 }
 
+already_AddRefed<SelectionCarets> PresShell::GetSelectionCarets() const
+{
+  nsRefPtr<SelectionCarets> selectionCaret = mSelectionCarets;
+  return selectionCaret.forget();
+}
+
 void PresShell::MaybeInvalidateCaretPosition()
 {
   if (mCaret) {
     mCaret->InvalidateOutsideCaret();
   }
 }
 
 void PresShell::SetCaret(nsCaret *aNewCaret)
@@ -2563,16 +2593,28 @@ PresShell::MayHaveTouchCaret()
     nsPIDOMWindow* innerWin = document->GetInnerWindow();
     if (innerWin) {
       return innerWin->MayHaveTouchCaret();
     }
   }
   return false;
 }
 
+Element*
+PresShell::GetSelectionCaretsStartElement() const
+{
+  return GetCanvasFrame() ? GetCanvasFrame()->GetSelectionCaretsStartElement() : nullptr;
+}
+
+Element*
+PresShell::GetSelectionCaretsEndElement() const
+{
+  return GetCanvasFrame() ? GetCanvasFrame()->GetSelectionCaretsEndElement() : nullptr;
+}
+
 void
 PresShell::BeginUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType)
 {
 #ifdef DEBUG
   mUpdateCount++;
 #endif
   mFrameConstructor->BeginUpdate();
 
@@ -6629,25 +6671,39 @@ PresShell::HandleEvent(nsIFrame* aFrame,
       (sDisableNonTestMouseEvents && !aEvent->mFlags.mIsSynthesizedForTests &&
        aEvent->HasMouseEventMessage())) {
     return NS_OK;
   }
 
   RecordMouseLocation(aEvent);
 
   // Determine whether event need to be consumed by touch caret or not.
-  if (TouchCaretPrefEnabled()) {
+  if (TouchCaretPrefEnabled() || SelectionCaretPrefEnabled()) {
     // We have to target the focus window because regardless of where the
     // touch goes, we want to access the touch caret when user is typing on an
     // editable element.
     nsCOMPtr<nsPIDOMWindow> window = GetFocusedDOMWindowInOurWindow();
     nsCOMPtr<nsIDocument> retargetEventDoc = window ? window->GetExtantDoc() : nullptr;
     nsCOMPtr<nsIPresShell> presShell = retargetEventDoc ?
                                        retargetEventDoc->GetShell() :
                                        nullptr;
+
+    nsRefPtr<SelectionCarets> selectionCaret = presShell ?
+                                               presShell->GetSelectionCarets() :
+                                               nullptr;
+    if (selectionCaret) {
+      *aEventStatus = selectionCaret->HandleEvent(aEvent);
+      if (*aEventStatus == nsEventStatus_eConsumeNoDefault) {
+        // If the event is consumed by the touch caret, Cancel APZC panning by
+        // setting mMultipleActionsPrevented.
+        aEvent->mFlags.mMultipleActionsPrevented = true;
+        return NS_OK;
+      }
+    }
+
     nsRefPtr<TouchCaret> touchCaret = presShell ? presShell->GetTouchCaret() : nullptr;
     if (touchCaret) {
       *aEventStatus = touchCaret->HandleEvent(aEvent);
       if (*aEventStatus == nsEventStatus_eConsumeNoDefault) {
         // If the event is consumed by the touch caret, cancel APZC panning by
         // setting mMultipleActionsPrevented.
         aEvent->mFlags.mMultipleActionsPrevented = true;
         return NS_OK;
--- a/layout/base/nsPresShell.h
+++ b/layout/base/nsPresShell.h
@@ -65,16 +65,19 @@ public:
   NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW
 
   // nsISupports
   NS_DECL_ISUPPORTS
 
   // Touch caret preference
   static bool TouchCaretPrefEnabled();
 
+  // Selection caret preference
+  static bool SelectionCaretPrefEnabled();
+
   void Init(nsIDocument* aDocument, nsPresContext* aPresContext,
             nsViewManager* aViewManager, nsStyleSet* aStyleSet,
             nsCompatibility aCompatMode);
   virtual void Destroy() MOZ_OVERRIDE;
   virtual void MakeZombie() MOZ_OVERRIDE;
 
   virtual nsresult SetPreferenceStyleRules(bool aForceReflow) MOZ_OVERRIDE;
 
@@ -211,16 +214,20 @@ public:
   virtual void ClearMouseCaptureOnView(nsView* aView) MOZ_OVERRIDE;
   virtual bool IsVisible() MOZ_OVERRIDE;
 
   // touch caret
   virtual already_AddRefed<mozilla::TouchCaret> GetTouchCaret() const MOZ_OVERRIDE;
   virtual mozilla::dom::Element* GetTouchCaretElement() const MOZ_OVERRIDE;
   virtual void SetMayHaveTouchCaret(bool aSet) MOZ_OVERRIDE;
   virtual bool MayHaveTouchCaret() MOZ_OVERRIDE;
+  // selection caret
+  virtual NS_HIDDEN_(already_AddRefed<mozilla::SelectionCarets>) GetSelectionCarets() const MOZ_OVERRIDE;
+  virtual NS_HIDDEN_(mozilla::dom::Element*) GetSelectionCaretsStartElement() const MOZ_OVERRIDE;
+  virtual NS_HIDDEN_(mozilla::dom::Element*) GetSelectionCaretsEndElement() const MOZ_OVERRIDE;
   // caret handling
   virtual already_AddRefed<nsCaret> GetCaret() const MOZ_OVERRIDE;
   virtual void MaybeInvalidateCaretPosition() MOZ_OVERRIDE;
   NS_IMETHOD SetCaretEnabled(bool aInEnable) MOZ_OVERRIDE;
   NS_IMETHOD SetCaretReadOnly(bool aReadOnly) MOZ_OVERRIDE;
   NS_IMETHOD GetCaretEnabled(bool *aOutEnabled) MOZ_OVERRIDE;
   NS_IMETHOD SetCaretVisibilityDuringSelection(bool aVisibility) MOZ_OVERRIDE;
   NS_IMETHOD GetCaretVisible(bool *_retval) MOZ_OVERRIDE;
@@ -766,16 +773,17 @@ protected:
   nsCOMPtr<nsIContent>      mLastAnchorScrolledTo;
   nsRefPtr<nsCaret>         mCaret;
   nsRefPtr<nsCaret>         mOriginalCaret;
   nsCallbackEventRequest*   mFirstCallbackEventRequest;
   nsCallbackEventRequest*   mLastCallbackEventRequest;
 
   // TouchCaret
   nsRefPtr<mozilla::TouchCaret> mTouchCaret;
+  nsRefPtr<mozilla::SelectionCarets> mSelectionCarets;
 
   // This timer controls painting suppression.  Until it fires
   // or all frames are constructed, we won't paint anything but
   // our <body> background and scrollbars.
   nsCOMPtr<nsITimer>        mPaintSuppressionTimer;
 
   // At least on Win32 and Mac after interupting a reflow we need to post
   // the resume reflow event off a timer to avoid event starvation because
--- a/layout/generic/nsCanvasFrame.cpp
+++ b/layout/generic/nsCanvasFrame.cpp
@@ -47,67 +47,97 @@ NS_IMPL_FRAMEARENA_HELPERS(nsCanvasFrame
 NS_QUERYFRAME_HEAD(nsCanvasFrame)
   NS_QUERYFRAME_ENTRY(nsCanvasFrame)
   NS_QUERYFRAME_ENTRY(nsIAnonymousContentCreator)
 NS_QUERYFRAME_TAIL_INHERITING(nsContainerFrame)
 
 nsresult
 nsCanvasFrame::CreateAnonymousContent(nsTArray<ContentInfo>& aElements)
 {
-  // We won't create touch caret element if preference is not enabled.
-  if (!PresShell::TouchCaretPrefEnabled()) {
+  if (!mContent) {
     return NS_OK;
   }
 
   nsCOMPtr<nsIDocument> doc = mContent->OwnerDoc();
-  nsCOMPtr<nsINodeInfo> nodeInfo;
+  nsresult rv = NS_OK;
+  ErrorResult er;
+  // We won't create touch caret element if preference is not enabled.
+  if (PresShell::TouchCaretPrefEnabled()) {
+    nsCOMPtr<nsINodeInfo> nodeInfo;
 
-  // Create and append touch caret frame.
-  nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::div, nullptr,
-                                                 kNameSpaceID_XHTML,
-                                                 nsIDOMNode::ELEMENT_NODE);
-  NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY);
+    // Create and append touch caret frame.
+    nodeInfo = doc->NodeInfoManager()->GetNodeInfo(nsGkAtoms::div, nullptr,
+                                                   kNameSpaceID_XHTML,
+                                                   nsIDOMNode::ELEMENT_NODE);
+    NS_ENSURE_TRUE(nodeInfo, NS_ERROR_OUT_OF_MEMORY);
 
-  nsresult rv = NS_NewHTMLElement(getter_AddRefs(mTouchCaretElement), nodeInfo.forget(),
-                                mozilla::dom::NOT_FROM_PARSER);
-  NS_ENSURE_SUCCESS(rv, rv);
-  aElements.AppendElement(mTouchCaretElement);
+    rv = NS_NewHTMLElement(getter_AddRefs(mTouchCaretElement), nodeInfo.forget(),
+                           mozilla::dom::NOT_FROM_PARSER);
+    NS_ENSURE_SUCCESS(rv, rv);
+    aElements.AppendElement(mTouchCaretElement);
+
+    // Add a _moz_anonclass attribute as touch caret selector.
+    mTouchCaretElement->SetAttribute(NS_LITERAL_STRING("_moz_anonclass"),
+                                     NS_LITERAL_STRING("mozTouchCaret"), er);
+    NS_ENSURE_SUCCESS(er.ErrorCode(), er.ErrorCode());
 
-  // Add a _moz_anonclass attribute as touch caret selector.
-  ErrorResult er;
-  mTouchCaretElement->SetAttribute(NS_LITERAL_STRING("_moz_anonclass"),
-                                   NS_LITERAL_STRING("mozTouchCaret"), er);
-  NS_ENSURE_SUCCESS(er.ErrorCode(), er.ErrorCode());
+    // Set touch caret to visibility: hidden by default.
+    nsAutoString classValue;
+    classValue.AppendLiteral("moz-touchcaret hidden");
+    rv = mTouchCaretElement->SetAttr(kNameSpaceID_None, nsGkAtoms::_class,
+                                     classValue, true);
+    NS_ENSURE_SUCCESS(rv, rv);
+  }
+
+  if (PresShell::SelectionCaretPrefEnabled()) {
+    // Selection caret
+    mSelectionCaretsStartElement = doc->CreateHTMLElement(nsGkAtoms::div);
+    aElements.AppendElement(mSelectionCaretsStartElement);
 
-  // Set touch caret to visibility: hidden by default.
-  nsAutoString classValue;
-  classValue.AppendLiteral("moz-touchcaret hidden");
-  rv = mTouchCaretElement->SetAttr(kNameSpaceID_None, nsGkAtoms::_class,
-                                   classValue, true);
-  NS_ENSURE_SUCCESS(rv, rv);
+    mSelectionCaretsEndElement = doc->CreateHTMLElement(nsGkAtoms::div);
+    aElements.AppendElement(mSelectionCaretsEndElement);
+
+    mSelectionCaretsStartElement->SetAttribute(NS_LITERAL_STRING("_moz_anonclass"),
+                                               NS_LITERAL_STRING("mozTouchCaret"), er);
+    rv = mSelectionCaretsStartElement->SetAttr(kNameSpaceID_None, nsGkAtoms::_class,
+                                               NS_LITERAL_STRING("moz-selectioncaret-left hidden"),
+                                               true);
+    NS_ENSURE_SUCCESS(rv, rv);
+
+    mSelectionCaretsEndElement->SetAttribute(NS_LITERAL_STRING("_moz_anonclass"),
+                                             NS_LITERAL_STRING("mozTouchCaret"), er);
+    rv = mSelectionCaretsEndElement->SetAttr(kNameSpaceID_None, nsGkAtoms::_class,
+                                             NS_LITERAL_STRING("moz-selectioncaret-right hidden"),
+                                             true);
+    NS_ENSURE_SUCCESS(rv, rv);
+  }
 
   return NS_OK;
 }
 
 void
 nsCanvasFrame::AppendAnonymousContentTo(nsBaseContentList& aElements, uint32_t aFilter)
 {
   aElements.MaybeAppendElement(mTouchCaretElement);
+  aElements.MaybeAppendElement(mSelectionCaretsStartElement);
+  aElements.MaybeAppendElement(mSelectionCaretsEndElement);
 }
 
 void
 nsCanvasFrame::DestroyFrom(nsIFrame* aDestructRoot)
 {
   nsIScrollableFrame* sf =
     PresContext()->GetPresShell()->GetRootScrollFrameAsScrollable();
   if (sf) {
     sf->RemoveScrollPositionListener(this);
   }
 
   nsContentUtils::DestroyAnonymousContent(&mTouchCaretElement);
+  nsContentUtils::DestroyAnonymousContent(&mSelectionCaretsStartElement);
+  nsContentUtils::DestroyAnonymousContent(&mSelectionCaretsEndElement);
   nsContainerFrame::DestroyFrom(aDestructRoot);
 }
 
 void
 nsCanvasFrame::ScrollPositionWillChange(nscoord aX, nscoord aY)
 {
   if (mDoPaintFocus) {
     mDoPaintFocus = false;
--- a/layout/generic/nsCanvasFrame.h
+++ b/layout/generic/nsCanvasFrame.h
@@ -71,16 +71,27 @@ public:
   virtual void AppendAnonymousContentTo(nsBaseContentList& aElements, uint32_t aFilter) MOZ_OVERRIDE;
 
   // Touch caret handle function
   mozilla::dom::Element* GetTouchCaretElement() const
   {
      return mTouchCaretElement;
   }
 
+  // Selection Caret Handle function
+  mozilla::dom::Element* GetSelectionCaretsStartElement() const
+  {
+    return mSelectionCaretsStartElement;
+  }
+
+  mozilla::dom::Element* GetSelectionCaretsEndElement() const
+  {
+    return mSelectionCaretsEndElement;
+  }
+
   /** SetHasFocus tells the CanvasFrame to draw with focus ring
    *  @param aHasFocus true to show focus ring, false to hide it
    */
   NS_IMETHOD SetHasFocus(bool aHasFocus);
 
   virtual void BuildDisplayList(nsDisplayListBuilder*   aBuilder,
                                 const nsRect&           aDirtyRect,
                                 const nsDisplayListSet& aLists) MOZ_OVERRIDE;
@@ -120,16 +131,18 @@ public:
   nsRect CanvasArea() const;
 
 protected:
   // Data members
   bool                      mDoPaintFocus;
   bool                      mAddedScrollPositionListener;
 
   nsCOMPtr<mozilla::dom::Element> mTouchCaretElement;
+  nsCOMPtr<mozilla::dom::Element> mSelectionCaretsStartElement;
+  nsCOMPtr<mozilla::dom::Element> mSelectionCaretsEndElement;
 };
 
 /**
  * Override nsDisplayBackground methods so that we pass aBGClipRect to
  * PaintBackground, covering the whole overflow area.
  * We can also paint an "extra background color" behind the normal
  * background.
  */
--- a/layout/generic/nsSelection.cpp
+++ b/layout/generic/nsSelection.cpp
@@ -49,16 +49,17 @@ static NS_DEFINE_CID(kFrameTraversalCID,
 #include "mozilla/Preferences.h"
 #include "nsDOMClassInfoID.h"
 
 //included for desired x position;
 #include "nsPresContext.h"
 #include "nsIPresShell.h"
 #include "nsCaret.h"
 #include "TouchCaret.h"
+#include "SelectionCarets.h"
 
 #include "mozilla/MouseEvents.h"
 #include "mozilla/TextEvents.h"
 
 #include "nsITimer.h"
 #include "nsFrameManager.h"
 // notifications
 #include "nsIDOMDocument.h"
@@ -711,16 +712,25 @@ nsFrameSelection::Init(nsIPresShell *aSh
   // Set touch caret as selection listener
   nsRefPtr<TouchCaret> touchCaret = mShell->GetTouchCaret();
   if (touchCaret) {
     int8_t index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL);
     if (mDomSelections[index]) {
       mDomSelections[index]->AddSelectionListener(touchCaret);
     }
   }
+
+  // Set selection caret as selection listener
+  nsRefPtr<SelectionCarets> selectionCarets = mShell->GetSelectionCarets();
+  if (selectionCarets) {
+    int8_t index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL);
+    if (mDomSelections[index]) {
+      mDomSelections[index]->AddSelectionListener(selectionCarets);
+    }
+  }
 }
 
 nsresult
 nsFrameSelection::MoveCaret(uint32_t          aKeycode,
                             bool              aContinueSelection,
                             nsSelectionAmount aAmount)
 {
   bool visualMovement =
@@ -1225,17 +1235,17 @@ nsFrameSelection::MaintainSelection(nsSe
   int8_t index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL);
   if (!mDomSelections[index])
     return NS_ERROR_NULL_POINTER;
 
   mMaintainedAmount = aAmount;
 
   const nsRange* anchorFocusRange =
     mDomSelections[index]->GetAnchorFocusRange();
-  if (anchorFocusRange) {
+  if (anchorFocusRange && aAmount != eSelectNoAmount) {
     mMaintainRange = anchorFocusRange->CloneRange();
     return NS_OK;
   }
 
   mMaintainRange = nullptr;
   return NS_OK;
 }
 
@@ -3035,16 +3045,23 @@ void
 nsFrameSelection::DisconnectFromPresShell()
 {
   // Remove touch caret as selection listener
   nsRefPtr<TouchCaret> touchCaret = mShell->GetTouchCaret();
   if (touchCaret) {
     int8_t index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL);
     mDomSelections[index]->RemoveSelectionListener(touchCaret);
   }
+
+  nsRefPtr<SelectionCarets> selectionCarets = mShell->GetSelectionCarets();
+  if (selectionCarets) {
+    int8_t index = GetIndexFromSelectionType(nsISelectionController::SELECTION_NORMAL);
+    mDomSelections[index]->RemoveSelectionListener(selectionCarets);
+  }
+
   StopAutoScrollTimer();
   for (int32_t i = 0; i < nsISelectionController::NUM_SELECTIONTYPES; i++) {
     mDomSelections[i]->Clear(nullptr);
   }
   mShell = nullptr;
 }
 
 //END nsISelection interface implementations
--- a/layout/style/ua.css
+++ b/layout/style/ua.css
@@ -293,35 +293,102 @@ div[\_moz_anonclass="mozTouchCaret"].moz
   position: absolute;
   width: 19px;
   height: 24px;
   margin-left: -10px;
   background-position: center center;
   z-index: 2147483647;
 }
 
+div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-left,
+div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-right {
+  background-image: url("resource://gre/res/text_caret.png");
+  position: absolute;
+  width: 21px;
+  height: 26px;
+  margin-left: -11px;
+  background-position: center center;
+  background-size: 100% 100%;
+  z-index: 2147483647;
+}
+
+div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-left.tilt {
+  background-image: url("resource://gre/res/text_caret_tilt_left.png");
+  margin-left: -22px;
+  width: 22px;
+}
+
+div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-right.tilt {
+  background-image: url("resource://gre/res/text_caret_tilt_right.png");
+  margin-left: 0px;
+  width: 22px;
+}
+
 @media (min-resolution: 1.5dppx) {
   div[\_moz_anonclass="mozTouchCaret"].moz-touchcaret {
     background-image: url("resource://gre/res/text_selection_handle@1.5.png");
     position: absolute;
     width: 29px;
     height: 36px;
     margin-left: -15px;
     background-position: center center;
     z-index: 2147483647;
   }
+
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-left,
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-right {
+    background-image: url("resource://gre/res/text_caret@1.5x.png");
+  }
+
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-left.tilt {
+    background-image: url("resource://gre/res/text_caret_tilt_left@1.5x.png");
+  }
+
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-right.tilt {
+    background-image: url("resource://gre/res/text_caret_tilt_right@1.5x.png");
+  }
 }
 
 @media (min-resolution: 2dppx) {
   div[\_moz_anonclass="mozTouchCaret"].moz-touchcaret {
     background-image: url("resource://gre/res/text_selection_handle@2.png");
     position: absolute;
     width: 38px;
     height: 48px;
     margin-left: -19px;
     background-position: center center;
     z-index: 2147483647;
   }
+
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-left,
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-right {
+    background-image: url("resource://gre/res/text_caret@2x.png");
+  }
+
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-left.tilt {
+    background-image: url("resource://gre/res/text_caret_tilt_left@2x.png");
+  }
+
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-right.tilt {
+    background-image: url("resource://gre/res/text_caret_tilt_right@2x.png");
+  }
 }
 
-div[\_moz_anonclass="mozTouchCaret"].moz-touchcaret.hidden {
+@media (min-resolution: 2.25dppx) {
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-left
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-right {
+    background-image: url("resource://gre/res/text_caret@2.25x.png");
+  }
+
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-left.tilt {
+    background-image: url("resource://gre/res/text_caret_tilt_left@2.25x.png");
+  }
+
+  div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-right.tilt {
+    background-image: url("resource://gre/res/text_caret_tilt_right@2.25x.png");
+  }
+}
+
+div[\_moz_anonclass="mozTouchCaret"].moz-touchcaret.hidden,
+div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-left.hidden,
+div[\_moz_anonclass="mozTouchCaret"].moz-selectioncaret-right.hidden {
   visibility: hidden;
 }
--- a/modules/libpref/src/init/all.js
+++ b/modules/libpref/src/init/all.js
@@ -4164,16 +4164,23 @@ pref("touchcaret.enabled", false);
 // caret is accepted)
 pref("touchcaret.distance.threshold", 1500);
 
 // We'll start to increment time when user release the control of touch caret.
 // When time exceed this expiration time, we'll hide touch caret.
 // In milliseconds. (0 means disable this feature)
 pref("touchcaret.expiration.time", 3000);
 
+// Turn off selection caret by default
+pref("selectioncaret.enabled", false);
+
+// This will inflate size of selection caret frame when we checking if
+// user click on selection caret or not. In app units.
+pref("selectioncaret.inflatesize.threshold", 40);
+
 // Wakelock is disabled by default.
 pref("dom.wakelock.enabled", false);
 
 // The URL of the Firefox Accounts auth server backend
 pref("identity.fxaccounts.auth.uri", "https://api.accounts.firefox.com/v1");
 
 // disable mozsample size for now
 pref("image.mozsamplesize.enabled", false);