From a37fc5efe4bd26d87121fc3fc0df4d2fd8ba88dc Mon Sep 17 00:00:00 2001 From: Phoebe Chang Date: Tue, 3 Jun 2014 15:08:25 +0800 Subject: [PATCH] Bug 924692 - Part 1: Add touch caret rendering support; r=roc --- b2g/installer/package-manifest.in | 3 + editor/composer/src/moz.build | 3 + .../src/res/text_selection_handle.png | Bin 0 -> 1580 bytes .../src/res/text_selection_handle@1.5.png | Bin 0 -> 1899 bytes .../src/res/text_selection_handle@2.png | Bin 0 -> 2382 bytes layout/base/nsCSSFrameConstructor.cpp | 30 ++++++++ layout/base/nsCSSFrameConstructor.h | 4 ++ layout/base/nsIPresShell.h | 12 ++++ layout/base/nsPresShell.cpp | 25 +++++++ layout/base/nsPresShell.h | 6 ++ layout/generic/nsCanvasFrame.cpp | 65 ++++++++++++++++-- layout/generic/nsCanvasFrame.h | 16 ++++- layout/style/ua.css | 38 ++++++++++ modules/libpref/src/init/all.js | 5 +- 14 files changed, 200 insertions(+), 7 deletions(-) create mode 100644 editor/composer/src/res/text_selection_handle.png create mode 100644 editor/composer/src/res/text_selection_handle@1.5.png create mode 100644 editor/composer/src/res/text_selection_handle@2.png diff --git a/b2g/installer/package-manifest.in b/b2g/installer/package-manifest.in index f3d4391c70b1..815bfc742a98 100644 --- a/b2g/installer/package-manifest.in +++ b/b2g/installer/package-manifest.in @@ -671,6 +671,9 @@ @BINPATH@/res/table-remove-row-active.gif @BINPATH@/res/table-remove-row-hover.gif @BINPATH@/res/table-remove-row.gif +@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/* diff --git a/editor/composer/src/moz.build b/editor/composer/src/moz.build index 443dfe5a66d3..b18b6f94e654 100644 --- a/editor/composer/src/moz.build +++ b/editor/composer/src/moz.build @@ -39,4 +39,7 @@ RESOURCE_FILES += [ 'res/table-remove-row-active.gif', 'res/table-remove-row-hover.gif', 'res/table-remove-row.gif', + 'res/text_selection_handle.png', + 'res/text_selection_handle@1.5.png', + 'res/text_selection_handle@2.png', ] diff --git a/editor/composer/src/res/text_selection_handle.png b/editor/composer/src/res/text_selection_handle.png new file mode 100644 index 0000000000000000000000000000000000000000..656854decc593d3ccd8767654f1743fb2523b64e GIT binary patch literal 1580 zcmaJ>eM}Q)7{5|2D%SZ0!>@6c4PhB=?@B+VwuP1tXIU*wVVaEV-L+I`@4P!~AqXN_ zotYoRt;*DF7^fmSC!#Sjm4GrJfNs&D!x<9nG}#=8T~Hu}T~Tm<=q`8nzVDOg_j`WN zN8X*Lj8y)t#j^ka;HRhQ&Fs2>{UT@Zg8u_Qy~Qqz7(+IbNmv;dLg9c8BP=+W?m%p~ z8Aq_9&Fy$10C3;6XJs?l#x*LGa0rp0kI?NPSu_A7YTP7(=Hm=#!EJV@S}^cqqX4vH zYQcJ`QEViW@jQE4F@bm@T%B-&@2*w z6D~}?TJSkf3ZLNU2l?Ibb-R^@yj7oDAZQchb?540@bK zDLcv72`3n2L@Y!hqZY7AU!>q5r)Zt@%QCSA6S)ym1PR5#lqMaG#{YM9IHtU5#*Dwx z`&wc;tBAx!W}GGpDU@xTH98oIR3%e5!VpvzK@?0@(UeCp1f55aU~;Amj5Q*t-5E5* zO(2X$Rl1XA5GRVK>(v65Luj{SDw#e>sW3oNC2UB7AcI7y(@T?Jg;Xw4LPE@a3X1y{WV&2a#$u#QR-Me#p|`az+!LK zlJG_?B36tj*xLWJdeX$sPjEXmxa?tS^l>LU?-V=OgBK)m01)y`x?Y#%?y)3X9r1Fa z6sNknYRaCM-!*LbY`ylvcwO7I-_}fQD`~%iL>OR&oYy4$pZ1R`(_L?ueHD>HEaoCJ%?ZKQ!`gy|%nl8{CQte072fqx?bn-5Hfwpg^A^t8PgI?r126HxbJnfhnaiU%(b1BNR~Mye!WJmJ zv_B6v0acfZ_}dn)Y!l0Ji~DTVZ3))pRY>P}>G)X6&YbbGvFDr{(bWmh9|aDjeib?N z*RTFjkk)zvBc=YQ(CVc_$j##c?TEbX?7&CG`Q3rhp+C6Fm_Uj9QS+(yZV5SGYpQfN zMn?zlm*o}@-#kiK`MWlySokB)9*iDH?V4Vw>A!z@wy)IcvEFX{c2ED-mgPS*x12nF zbjRUda`8X@){C|;52||4e0n~tZR^bIWmURkyt8S;VbsGN>Lmjb7~0BPT*K>}w^4Cr z$TxOBb@%WxZN-+5OVw?od(6`~_2FT$heGNS!y2n=v31^+d+RPN|Dy8q8Il$9JBp9&^b6-|IF?Gz_*t(FBq~<(5io*lF> BTr2

lcX7VN;Vj2a!mCXqrG8FjES1;K$tWQAJGr#@|HqylOcpBl@R z`bl+*k!1CfEDVXxii%NYr6_|`)J35{h!G+LGzbm@Mop?#4;lH?QC*1GJIrh(^aDYF$76vDxjY`Y0O0t69JU|v@|fU4h|7aG0l=GwN_fLm zNswF={>B$^;!~4xTnDk)27`fR@Mode3N{!N6y(t0aF_&wsn68nu#u_N)5a7;h+c`Q zb+{VU0uDtu5lzSWR3g&XDQI+WWwrV@Wg-g3Ho`hK$ntZfGzOGP{~xN+yhZDAIr2}u z|0%4G$g95{d`f$R8AQ%&EvxT&Si#c z%Qk&s(Qu`~yy-XAySwEv+@Mzsi~Gi?3HvU;*zFDh_I>*+wo@657CJ<0(tWM%6eKG|630I^HY~ho^{NJ!@K6m zJHv))n?18n7`Ib-q4uW%(~g=s{dur8siQ{VRFJ=wp5AhF0*NuSsxU%R)RFdVy35YQ zUu7#aHX=&&_gnI&X#= zX5*pk_!Nucnrrlv-9Ivt7|9yMNz9mYAX`qFbx*6IM zW_c5(p$6uZ(YaOhe(QsmeOYO3L(Y_4U~F~4tZe~1sMBI6IyWb{$imEjd3X>y}oBH z7Qg9J@6%2O>)eK0vSXG%=smE@KtMb+5Y*cDc=L?j%Id*_xCzCS`jg&IN>Q}uTPVIH zG;c%0B)6X^l8lUyoH)kJR$HgSmT)o0{dh;0si$gDPW?IM@tn=hHxxV8fVVU1$Ro9+ zfwRd6Ey23!dke)FWa%FSL|)}Xt|a;KXNY1vDk_Z=?xZS(iG9B%GvYumoIm+vLM zee6q}<|(!4YMb?LpKtORtgWSXwM~}$>~u70iL%`v`uh3o@`~k&_QzXfh57IFE}udB z{?P8J8pOwAz_T**?BJaNOK%zFXCS<@>DDDN^BSr&=hyj#zdNV2wtQr6^niZmMOxj- zn%j(`d}XW^>$`RFUdsK5guAm$=FYPT9RL>GQnJO*)SBT*Q7>h-E{jYIFEzDx_v*@k zz{cMn+1p=U(b!ko)BhSu5w~w+CvQl&+W$@WqiV|e{2Y&c;S|=KQ|MRC+iJ|*+}P-9Z@h^*xsotzgjuvVmbmC7k|Zoj JbWoU(_cu`)2HXGu literal 0 HcmV?d00001 diff --git a/editor/composer/src/res/text_selection_handle@2.png b/editor/composer/src/res/text_selection_handle@2.png new file mode 100644 index 0000000000000000000000000000000000000000..a7fc3901ae69ac20299ea421aab904807801831e GIT binary patch literal 2382 zcmaJ@dpwkB8y-1k$RxWt8^aQ7%)!hs!-Sck#K^~pB#fCC6Z6i|B8Or#5%G1{CABKD zib6?~V^l&1owH3VY(1aBi z3dC_X?i2z+JN+4~o$)Lp8{xhl?v_ka5O4u86Q0aX07ax^GU5|2NwHU&Q3&`a7jZlp z@pn?8^Z+=OCj{VlM<*l;jlsYP1V;=GPat3%;8-*Ui$W`20uqBG;Rz(HGyL;|P(%~5 zV@QEC@6WLmCo&>VEasC?sHCJM$0R35o-h`LArgs74lEX_@IZ=EKru5J35u+i8EAlr zCFJnM93BW)GBTriiDEKBk?G$haQRwSkGlFjmJvl0-$&q%l-%J^;N7=3|zh$yNd>qpWP zf`Sd&7v3$z^)+mFCde8tWL6uo653%D4MQuZ?u|J%*mBDfU3b3fORF6SYL-47r)>ya z?^z01ePH!5#Huwg+^Sf^tzy*=9XHfIsBG(c0*=p5mCim%E%F_`l#!5b+n6%Z-_|xe zMjR`>{= z=bTIM`x_4m4GT6Kk9l_-4%DHS=3ggk;KL_xV^8ltf!AF`-nw}H;seHo zYdQV!buO?ytm%0;Ae9Q} zy^e(qNoo)$HygWNM2s=$yOH4pz%OQI?U*fx0C|y9gXCOtLpUZA1l29cp(} zo%na1>~h)LX>J7r7IQ=OMbw+J(o4fnsXDigd=uo5R>oX-Yc)~|_bisM77+gr2&MAPbx8!{6zQWyWhAi3;Ct4xf8g94hnh!%7YTYK&j*Ba~{m%h>vB|d*W zQ~1}xX6cCJ_74UNRc)Ycqfxs_rOWU9GZFrd#cr2KVYR<)+ydnv93Hio*ZB*Z-wHE{ zHQPTz1%sCQXlZlh!*>bsRR_Apyrz1kuPOy*yW3mTbm%V4SLWsno9txay<V)6?@UePi$JQ{~_Pnc?DHcf;CPrxUXTiej z$3pVwWGWwg*J`N$$O$FKE>S{LoPzYt&$dcS`f4-!`k(c$L@f*&p4!xy+HT#HZ{jj5 zT3flFN0e zss`LZdhtdPmpniA78(0_!k|wGSpo0D)lc!nhlF;{gS5I4HBr@cTeC(_Gg35 zuN{a@nSyRNyq%ezW4hR2o&DhQwEUPsr>Q!%;A|w7W}T~o51)H&RBiFCeJI?+qoeMT nsjf}n?uaTm-V$~|u4V`s-8W6mvG^`cdBgGX@~72MqO$%2#aQOF literal 0 HcmV?d00001 diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 2933bbc2d0c2..9b8353a2c064 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -29,6 +29,7 @@ #include "nsTableCellFrame.h" #include "nsIDOMHTMLDocument.h" #include "nsHTMLParts.h" +#include "nsPresShell.h" #include "nsIPresShell.h" #include "nsUnicharUtils.h" #include "nsStyleSet.h" @@ -2597,6 +2598,12 @@ nsCSSFrameConstructor::ConstructDocElementFrame(Element* aDocEle SetInitialSingleChild(mDocElementContainingBlock, newFrame); + // Create touch caret frame if there is a canvas frame + if (mDocElementContainingBlock->GetType() == nsGkAtoms::canvasFrame) { + ConstructAnonymousContentForCanvas(state, mDocElementContainingBlock, + aDocElement); + } + return newFrame; } @@ -2852,6 +2859,29 @@ nsCSSFrameConstructor::SetUpDocElementContainingBlock(nsIContent* aDocElement) } } +void +nsCSSFrameConstructor::ConstructAnonymousContentForCanvas(nsFrameConstructorState& aState, + nsIFrame* aFrame, + nsIContent* aDocElement) +{ + NS_ASSERTION(aFrame->GetType() == nsGkAtoms::canvasFrame, "aFrame should be canvas frame!"); + + nsAutoTArray anonymousItems; + GetAnonymousContent(aDocElement, aFrame, anonymousItems); + if (anonymousItems.IsEmpty()) { + // Touch caret is not enabled. + return; + } + + FrameConstructionItemList itemsToConstruct; + nsContainerFrame* frameAsContainer = do_QueryFrame(aFrame); + AddFCItemsForAnonymousContent(aState, frameAsContainer, anonymousItems, itemsToConstruct); + + nsFrameItems frameItems; + ConstructFramesFromItemList(aState, itemsToConstruct, frameAsContainer, frameItems); + frameAsContainer->AppendFrames(kPrincipalList, frameItems); +} + nsContainerFrame* nsCSSFrameConstructor::ConstructPageFrame(nsIPresShell* aPresShell, nsPresContext* aPresContext, diff --git a/layout/base/nsCSSFrameConstructor.h b/layout/base/nsCSSFrameConstructor.h index c97555deb17c..edb6ffe0e7f5 100644 --- a/layout/base/nsCSSFrameConstructor.h +++ b/layout/base/nsCSSFrameConstructor.h @@ -1769,6 +1769,10 @@ private: nsIContent* aContent, nsStyleContext* aStyleContext, bool aIsGeneratedContent); + // Create touch caret frame. + void ConstructAnonymousContentForCanvas(nsFrameConstructorState& aState, + nsIFrame* aFrame, + nsIContent* aDocElement); public: diff --git a/layout/base/nsIPresShell.h b/layout/base/nsIPresShell.h index 1a6377892b8b..dcb93c0f02f7 100644 --- a/layout/base/nsIPresShell.h +++ b/layout/base/nsIPresShell.h @@ -53,6 +53,7 @@ class nsViewManager; class nsView; class nsRenderingContext; class nsIPageSequenceFrame; +class nsCanvasFrame; class nsAString; class nsCaret; class nsFrameSelection; @@ -467,6 +468,12 @@ public: */ virtual nsIPageSequenceFrame* GetPageSequenceFrame() const = 0; + /** + * Returns the canvas frame associated with the frame hierarchy. + * Returns nullptr if is XUL document. + */ + virtual nsCanvasFrame* GetCanvasFrame() const = 0; + /** * Gets the real primary frame associated with the content object. * @@ -735,6 +742,11 @@ public: */ virtual void NotifyDestroyingFrame(nsIFrame* aFrame) = 0; + /** + * Returns the touch caret element of the presshell. + */ + virtual mozilla::dom::Element* GetTouchCaretElement() const = 0; + /** * Get the caret, if it exists. AddRefs it. */ diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 02fcc1bc5e0b..53ff6ce41cf9 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -701,6 +701,18 @@ nsIPresShell::FrameSelection() static bool sSynthMouseMove = true; static uint32_t sNextPresShellId; static bool sPointerEventEnabled = true; +static bool sTouchCaretEnabled = false; + +/* static */ bool +PresShell::TouchCaretPrefEnabled() +{ + static bool initialized = false; + if (!initialized) { + Preferences::AddBoolVarCache(&sTouchCaretEnabled, "touchcaret.enabled"); + initialized = true; + } + return sTouchCaretEnabled; +} PresShell::PresShell() : mMouseLocation(NS_UNCONSTRAINEDSIZE, NS_UNCONSTRAINEDSIZE) @@ -2472,6 +2484,19 @@ PresShell::GetPageSequenceFrame() const return do_QueryFrame(frame); } +nsCanvasFrame* +PresShell::GetCanvasFrame() const +{ + nsIFrame* frame = mFrameConstructor->GetDocElementContainingBlock(); + return do_QueryFrame(frame); +} + +Element* +PresShell::GetTouchCaretElement() const +{ + return GetCanvasFrame() ? GetCanvasFrame()->GetTouchCaretElement() : nullptr; +} + void PresShell::BeginUpdate(nsIDocument *aDocument, nsUpdateType aUpdateType) { diff --git a/layout/base/nsPresShell.h b/layout/base/nsPresShell.h index 460b7195a218..667a436521f9 100644 --- a/layout/base/nsPresShell.h +++ b/layout/base/nsPresShell.h @@ -67,6 +67,9 @@ public: // nsISupports NS_DECL_ISUPPORTS + // Touch caret preference + static bool TouchCaretPrefEnabled(); + void Init(nsIDocument* aDocument, nsPresContext* aPresContext, nsViewManager* aViewManager, nsStyleSet* aStyleSet, nsCompatibility aCompatMode); @@ -90,6 +93,7 @@ public: virtual nsresult ResizeReflow(nscoord aWidth, nscoord aHeight) MOZ_OVERRIDE; virtual nsresult ResizeReflowOverride(nscoord aWidth, nscoord aHeight) MOZ_OVERRIDE; virtual nsIPageSequenceFrame* GetPageSequenceFrame() const MOZ_OVERRIDE; + virtual nsCanvasFrame* GetCanvasFrame() const MOZ_OVERRIDE; virtual nsIFrame* GetRealPrimaryFrameFor(nsIContent* aContent) const MOZ_OVERRIDE; virtual nsIFrame* GetPlaceholderFrameFor(nsIFrame* aFrame) const MOZ_OVERRIDE; @@ -207,6 +211,8 @@ public: virtual void ClearMouseCaptureOnView(nsView* aView) MOZ_OVERRIDE; virtual bool IsVisible() MOZ_OVERRIDE; + // touch caret + virtual mozilla::dom::Element* GetTouchCaretElement() const MOZ_OVERRIDE; // caret handling virtual already_AddRefed GetCaret() const MOZ_OVERRIDE; virtual void MaybeInvalidateCaretPosition() MOZ_OVERRIDE; diff --git a/layout/generic/nsCanvasFrame.cpp b/layout/generic/nsCanvasFrame.cpp index 1cb0f3dc359b..c2841eb02aad 100644 --- a/layout/generic/nsCanvasFrame.cpp +++ b/layout/generic/nsCanvasFrame.cpp @@ -12,12 +12,17 @@ #include "nsStyleContext.h" #include "nsRenderingContext.h" #include "nsGkAtoms.h" +#include "nsPresShell.h" #include "nsIPresShell.h" #include "nsDisplayList.h" #include "nsCSSFrameConstructor.h" #include "nsFrameManager.h" #include "gfxPlatform.h" - +// for touchcaret +#include "nsContentList.h" +#include "nsContentCreatorFunctions.h" +#include "nsContentUtils.h" +#include "nsStyleSet.h" // for focus #include "nsIScrollableFrame.h" #ifdef DEBUG_CANVAS_FOCUS @@ -40,8 +45,53 @@ 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& aElements) +{ + // We won't create touch caret element if preference is not enabled. + if (!PresShell::TouchCaretPrefEnabled()) { + return NS_OK; + } + + nsCOMPtr doc = mContent->OwnerDoc(); + nsCOMPtr 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); + + nsresult 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. + 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); + + return NS_OK; +} + +void +nsCanvasFrame::AppendAnonymousContentTo(nsBaseContentList& aElements, uint32_t aFilter) +{ + aElements.MaybeAppendElement(mTouchCaretElement); +} + void nsCanvasFrame::DestroyFrom(nsIFrame* aDestructRoot) { @@ -51,6 +101,7 @@ nsCanvasFrame::DestroyFrom(nsIFrame* aDestructRoot) sf->RemoveScrollPositionListener(this); } + nsContentUtils::DestroyAnonymousContent(&mTouchCaretElement); nsContainerFrame::DestroyFrom(aDestructRoot); } @@ -98,9 +149,14 @@ nsCanvasFrame::AppendFrames(ChildListID aListID, nsFrameList& aFrameList) { MOZ_ASSERT(aListID == kPrincipalList, "unexpected child list"); - MOZ_ASSERT(mFrames.IsEmpty(), "already have a child frame"); - MOZ_ASSERT(aFrameList.FirstChild() == aFrameList.LastChild(), - "Only one principal child frame allowed"); + if (!mFrames.IsEmpty()) { + for (nsFrameList::Enumerator e(aFrameList); !e.AtEnd(); e.Next()) { + // We only allow native anonymous child frame for touch caret, + // which its placeholder is added to the Principal child lists. + MOZ_ASSERT(e.get()->GetContent()->IsInNativeAnonymousSubtree(), + "invalid child list"); + } + } nsFrame::VerifyDirtyBitSet(aFrameList); nsContainerFrame::AppendFrames(aListID, aFrameList); } @@ -121,7 +177,6 @@ nsCanvasFrame::RemoveFrame(ChildListID aListID, nsIFrame* aOldFrame) { MOZ_ASSERT(aListID == kPrincipalList, "unexpected child list"); - MOZ_ASSERT(aOldFrame == mFrames.FirstChild(), "unknown aOldFrame"); nsContainerFrame::RemoveFrame(aListID, aOldFrame); } #endif diff --git a/layout/generic/nsCanvasFrame.h b/layout/generic/nsCanvasFrame.h index d476f1a8c71d..b15feec0cb1c 100644 --- a/layout/generic/nsCanvasFrame.h +++ b/layout/generic/nsCanvasFrame.h @@ -13,6 +13,7 @@ #include "nsContainerFrame.h" #include "nsIScrollPositionListener.h" #include "nsDisplayList.h" +#include "nsIAnonymousContentCreator.h" class nsPresContext; class nsRenderingContext; @@ -25,7 +26,8 @@ class nsRenderingContext; * frame */ class nsCanvasFrame : public nsContainerFrame, - public nsIScrollPositionListener + public nsIScrollPositionListener, + public nsIAnonymousContentCreator { public: nsCanvasFrame(nsStyleContext* aContext) @@ -64,6 +66,16 @@ public: ~(nsIFrame::eCanContainOverflowContainers)); } + // nsIAnonymousContentCreator + virtual nsresult CreateAnonymousContent(nsTArray& aElements) MOZ_OVERRIDE; + virtual void AppendAnonymousContentTo(nsBaseContentList& aElements, uint32_t aFilter) MOZ_OVERRIDE; + + // Touch caret handle function + mozilla::dom::Element* GetTouchCaretElement() const + { + return mTouchCaretElement; + } + /** SetHasFocus tells the CanvasFrame to draw with focus ring * @param aHasFocus true to show focus ring, false to hide it */ @@ -111,6 +123,8 @@ protected: // Data members bool mDoPaintFocus; bool mAddedScrollPositionListener; + + nsCOMPtr mTouchCaretElement; }; /** diff --git a/layout/style/ua.css b/layout/style/ua.css index 9696b6404ed3..dfe44240c5a6 100644 --- a/layout/style/ua.css +++ b/layout/style/ua.css @@ -283,3 +283,41 @@ parsererror|sourcetext { font-weight: bold; font-size: 12pt; } + +div[\_moz_anonclass="mozTouchCaret"].moz-touchcaret { + background-image: url("resource://gre/res/text_selection_handle.png"); + position: absolute; + width: 19px; + height: 24px; + margin-left: -10px; + background-position: center center; + z-index: 2147483647; +} + +@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; + } +} + +@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-touchcaret.hidden { + visibility: hidden; +} diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 025b1028dfca..fff6108cdf5d 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -2087,7 +2087,7 @@ pref("svg.svg-iframe.enabled", false); pref("svg.svg-iframe.enabled", false); #endif -// Is support for the new getBBox method from SVG 2 enabled? +// Is support for the new getBBox method from SVG 2 enabled? // See https://svgwg.org/svg2-draft/single-page.html#types-SVGBoundingBoxOptions #ifdef RELEASE_BUILD pref("svg.new-getBBox.enabled", false); @@ -4148,6 +4148,9 @@ pref("urlclassifier.disallow_completions", "test-malware-simple,test-phish-simpl // Turn off Spatial navigation by default. pref("snav.enabled", false); +// Turn off touch caret by default. +pref("touchcaret.enabled", false); + // Wakelock is disabled by default. pref("dom.wakelock.enabled", false);