Commit Graph

338 Commits

Author SHA1 Message Date
Jonathan Kew
e252e8c89f Bug 1193519 pt 6 - Adjust the position of the caret bidi indicator appropriately for sideways-lr mode. r=dholbert 2015-09-24 10:23:34 +01:00
Ting-Yu Lin
a56b2e5e55 Bug 1200194 - Expose nsCaret::GetFrameAndOffset for reuse. r=roc
This function can be reused by AccessibleCaret.
2015-09-09 16:47:20 +08:00
Masayuki Nakano
f59053cabd Bug 555642 part.1 nsCaret should have a way to override the caret visible state for hiding caret temporarily and nsEditor should hide caret if composition string doesn't have caret information r=roc 2015-08-17 20:58:38 +09:00
Ted Clancy
983dbf2ce8 Bug 1164693 - Part 1: Directional caret should point in caret direction in bidi paragraphs. r=smontagu 2015-06-05 21:44:54 -04:00
Ted Clancy
a6d1596837 Bug 1067788 - Part 2: Fixes to caret positioning in bidi text. r=smontagu 2015-05-28 08:05:25 -04:00
Mark Capella
b246467b7b Bug 988143 - Enable Gecko Touch in Fennec, Android specific nsCaret mods, r=ehsan 2015-05-14 22:06:13 -04:00
Mark Finkle
e6b5f15406 Bug 1159263 - Add support to nsCaret to stop blinking after a set of cycles r=roc r=snorp 2015-04-29 10:23:19 -04:00
Ethan Lin
c2c987ad14 Bug 1141926 - Check nsCaret visibility when NotifySelectionChanged. r=roc 2015-03-10 23:01:00 -04:00
Ehsan Akhgari
a916924d05 Bug 989012 - Part 1: Stop after passing over a non-selectable frame if one is found during the frame traversal; r=roc
The caret movement code already handles unselectable text frames if we
happen to land in the middle of one in nsTextFrame::PeekOffsetCharacter/Word.
However, when performing frame traversal to find the next frame to jump
to, we don't remember if we skipped over an unselectable frame, which causes
us to jump one offset too much when the caret is on the boundary of
selectable and unselectable content.  The test cases demonstrate the
scenario.  Note that an <img alt=foo> is implemented by adding a
generated content to the inline frame representing it, so as far as
the caret movement code is concerned, both test cases are treated similarly.

Note that we need to do this only when moving the selection, and not
when extending it.  We are adding an aExtend argument to
nsPeekOffsetStruct's constructor in order to be able to special case
that.
2015-01-27 23:11:26 -05:00
Ehsan Akhgari
d4c6d2cd2e Backed out 2 changesets (bug 989012) because of test failure on Linux32 opt mochitest-a11y on a CLOSED TREE
Backed out changeset 9698f6f3f72e (bug 989012)
Backed out changeset 22fb05349a10 (bug 989012)
2015-01-27 16:40:30 -05:00
Ehsan Akhgari
59c2df2758 Bug 989012 - Part 1: Stop after passing over a non-selectable frame if one is found during the frame traversal; r=roc
The caret movement code already handles unselectable text frames if we
happen to land in the middle of one in nsTextFrame::PeekOffsetCharacter/Word.
However, when performing frame traversal to find the next frame to jump
to, we don't remember if we skipped over an unselectable frame, which causes
us to jump one offset too much when the caret is on the boundary of
selectable and unselectable content.  The test cases demonstrate the
scenario.  Note that an <img alt=foo> is implemented by adding a
generated content to the inline frame representing it, so as far as
the caret movement code is concerned, both test cases are treated similarly.

Note that we need to do this only when moving the selection, and not
when extending it.  We are adding an aExtend argument to
nsPeekOffsetStruct's constructor in order to be able to special case
that.
2015-01-27 15:35:32 -05:00
Jonathan Kew
6a5c361e8b Bug 1077515 - part 3 - Change desiredX (nscoord) to desiredPos (nsPoint) in nsPeekOffsetStruct, to support maintaining either vertical or horizontal position on inter-line moves. r=roc 2014-11-22 14:39:03 +00:00
Simon Montagu
4c365d8f67 Bug 1100071 patch 2: add macros for common tests whether bidi level is odd and whether two bidi levels have the same parity, r=dholbert 2014-11-20 12:45:22 +02:00
Simon Montagu
3eb81bde1c Bug 1100071 patch 1: change uint8_t to nsBidiLevel in a few more places, r=dholbert 2014-11-20 12:45:22 +02:00
Daniel Holbert
204aad175f Bug 1098558: Remove unused constant NS_STYLE_DIRECTION_INHERIT. r=smontagu 2014-11-13 15:50:39 -08:00
Jonathan Kew
c8db4d94cb Bug 1093553 - Followup to fix positioning of the caret with writing-mode:vertical-lr and text-orientation:sideways-right. r=smontagu 2014-11-13 08:58:06 +00:00
Jonathan Watt
474e2fff50 Bug 1090611 - Make nsCaret::PaintCaret take a Moz2D DrawTarget instead of nsRenderingContext. r=Bas 2014-10-29 17:07:11 +00:00
Jonathan Watt
05b59bc989 Bug 1088625, part 1 - Add lots of missing nsFontMetrics.h and gfxTextRun.h includes 2014-10-24 16:28:14 +01:00
Jonathan Watt
3b52cf43ad Bug 1086708 - Rename the snapping variant of NSRectToRect to NSRectToSnappedRect. r=mattwoodrow 2014-10-22 12:29:06 +01:00
Jonathan Watt
40da0a5dbd Bug 1083753, part 2 - Port the code that uses nsRenderingContext::FillRect(nsRect) to Moz2D. r=mattwoodrow 2014-10-19 13:22:22 +01:00
Jonathan Kew
dbd542017f Bug 902762 pt 7 - Draw caret appropriately for vertical textruns. r=smontagu 2014-10-01 20:25:50 +01:00
Mason Chang
4ec05c47e8 Bug 1063265 - Stop Blinking the Text Caret when it isn't visible. r=roc 2014-09-06 12:25:00 +02:00
Robert O'Callahan
53bc0bc443 Bug 1048752. Part 39: Call SelectionLanguageChange even when bidi keyboard is not available, for consistency, and fix broken tests. r=jfkthame 2014-08-13 01:27:02 +12:00
Robert O'Callahan
a127e060c2 Bug 1048752. Part 37: GetGeometryForFrame should return a rect instead of an nsresult. r=tn 2014-08-06 17:19:32 +12:00
Robert O'Callahan
61e0866c4d Bug 1048752. Part 36: Remove ancient horizontal rules. r=tn 2014-08-06 17:19:31 +12:00
Robert O'Callahan
5902534db2 Bug 1048752. Part 35: Remove GetFrameSelection (unused). r=tn 2014-08-06 17:19:31 +12:00
Robert O'Callahan
d9b69b3d08 Bug 1048752. Part 34: Handle null selection returned by GetSelection(). r=tn
Previous changes broke this. Tests caught it.
2014-08-06 17:19:31 +12:00
Robert O'Callahan
0e15cd5d98 Bug 1048752. Part 33: A zero blink rate should mean the caret is always on. r=tn
Previous changes broke this.
2014-08-06 17:19:31 +12:00
Robert O'Callahan
3d7390b063 Bug 1048752. Part 32: Rename DrawAtPosition to SetCaretPosition and don't make it turn off blinking. r=tn
There's no need for this method to turn off blinking anymore. Its only
caller already calls SetCaretReadOnly to achieve the same effect. That
means we don't actually need the mIsBlinking flag after all.
2014-08-06 17:19:31 +12:00
Robert O'Callahan
a3dfe0f5b1 Bug 1048752. Part 31: nsCaret.h must be the first #include in nsCaret.cpp. r=tn
Also cleans up a couple of other ordering issues.
2014-08-06 17:19:30 +12:00
Robert O'Callahan
e06fa28324 Bug 1048752. Part 30: Simplify caret blinking logic. r=tn
A few things got mashed together here:
-- Inline KillTimer/PrimeTimer into their callers.
-- Instead of having to call StopBlinking and StartBlinking together,
change StartBlinking to ResetBlinking and have it set up
the correct blink state and reset the blink cycle.
-- nsCaret::NotifySelectionChange needs a SchedulePaint
-- nsCaret::DrawAtPosition needs a ResetBlinking
2014-08-06 17:19:30 +12:00
Robert O'Callahan
769a938550 Bug 1048752. Part 29: mVisible is never true in nsCaret::Init. r=tn 2014-08-06 17:19:30 +12:00
Robert O'Callahan
3a827f62c8 Bug 1048752. Part 28: Remove unused fields and rename mLast* to mOverride*. r=tn 2014-08-06 17:19:30 +12:00
Robert O'Callahan
85137c3fab Bug 1048752. Part 27: Remove obsolete caret state logic and just SchedulePaint as needed. r=tn
This is the core of the whole patch set.

Now GetPaintGeometry/PaintCaret figure out on their own almost all the state
they need every time we paint. So when caret flags change, all we need
to do is SchedulePaint. We don't need to fiddle with mDrawn and most of the
logic in DrawCaret is obsolete. (In fact, it was duplicated by GetGeometry
and friends, and we're removing that duplication.) EraseCaret, CheckCaretState
and UpdateCaretPosition are also obsolete.

We need to have GetPaintGeometry/PaintCaret choose the correct content node
and offset, either getting them from the Selection or using specific data set by
DrawAtPosition. This logic, plus a bit of other code shared between them, is
put into the helper GetFrameAndOffset.
2014-08-06 17:19:29 +12:00
Robert O'Callahan
3f48a9f088 Bug 1048752. Part 26: Move all "should draw caret" responsibility to GetPaintGeometry. r=tn
Instead of checking the mysterious mDrawn state (which is evil and will be
removed), let nsCaret::GetPaintGeometry take sole responsibilty for deciding
whether to draw. It takes the nsStyleUserInterface checks. It also needs to
check blink state, which is made possible by separating blink state into
the mIsBlinkOn flag.
2014-08-06 17:19:29 +12:00
Robert O'Callahan
54fc73fb14 Bug 1048752. Part 25: Inline MustDrawCaret into IsVisible. r=tn
This also fixes what appears to be a bug. MustDrawCaret returned true
when mShowDuringSelection is set even if the caret would otherwise be
hidden due a popup showing. That doesn't make sense.
2014-08-06 17:19:29 +12:00
Robert O'Callahan
d51bd7ae75 Bug 1048752. Part 24: Rename and deCOM Set/GetCaretVisible. r=tn 2014-08-06 17:19:29 +12:00
Robert O'Callahan
1d4bbbe942 Bug 1048752. Part 23: Remove aIgnoreDrawnState from MustDrawCaret. r=tn 2014-08-06 17:19:28 +12:00
Robert O'Callahan
e515900dec Bug 1048752. Part 22: Factor out SelectionLanguageChange call to run early in nsCaret::GetPaintGeometry. r=tn
This code is somewhat tricky. nsCaret::ComputeCaretRects was checking to see
if we have a bidi keyboard, and if so, what direction it's set to.
If the direction changed from the last direction seen for *this caret*,
we fired a SelectionLanguageChange notification on the caret's current
Selection. This looked bogus because the caret can be switched between
selections so it would seem some selections won't get a notification when
they should, but that's how it was. Also, when the SelectionLanguageChange
notification fired we then didn't draw the caret in that iteration, which
seems even more bogus.

This patch fixes all that by moving the logic to fire SelectionLanguageChange
out to GetPaintGeometry and firing the notification every single time without
trying to detect whether the state has changed or not. I carefully examined
the implementation of SelectionLanguageChange and I'm pretty sure it's
idempotent so this should be correct. That doesn't look like an
expensive function, and runs at most once per window paint, so I'm not
worried about perf. Because we now fire SelectionLanguageChange before
reading selection or frame state, it should be fine to carry on after
calling SelectionLanguageChange and drawing the caret based on whatever
changes SelectionLanguageChange has performed.

This also lets us remove mKeyboardRTL, which as noted above seems inherently
bogus.
2014-08-06 17:19:28 +12:00
Robert O'Callahan
c6baf90fef Bug 1048752. Part 21: Instead of storing mCaretRect/mHookRect, recompute them whenever they're needed. r=tn
Also, moves the "If the offset falls outside of the frame" check from
PaintCaret to GetPaintGeometry so we do less work in that case.

UpdateCaretRects is no longer needed.
2014-08-06 17:19:28 +12:00
Robert O'Callahan
490fd8f865 Bug 1048752. Part 20: Inline GetCaretFrame into its callers. r=tn
This duplicates some code, but later patches will modify the callers and then
eventually we'll re-share common code.
2014-08-06 17:19:28 +12:00
Robert O'Callahan
2632a625e0 Bug 1048752. Part 19: Create nsCaret::GetPaintGeometry to call during painting. r=tn
This is the start of the changes to caret-drawing proper.

The idea is to combine GetCaretFrame and GetCaretRect into a method
GetPaintGeometry which looks like GetGeometry but returns values
needed for painting (i.e. including bidi decorations, and returning
a null frame if we're not supposed to paint due to specific caret
state, e.g. in the "off" phase of the blink cycle).

Mostly a straightforward refactoring but there are a few interesting changes:
-- nsDisplayCaret stores its bounds instead of getting them from nsCaret on
demand. Eventually those bounds will not be stored in nsCaret at all.
-- nsDisplayCaret::GetBounds returns true for aSnap. nsCaret draws snapped
rects, so why not.
-- I removed "if (caretRect.Intersects(aDirtyRect))" in EnterPresShell.
As far as I can tell, this check is incorrect because it doesn't take
transforms into account. Since there's at most one drawn caret per window,
hence we do this at most once per paint, I don't think there's any real
performance advantage to having this check.
2014-08-06 17:19:28 +12:00
Robert O'Callahan
8451403377 Bug 1048752. Part 18: Add nsCaret::SchedulePaint. r=tn
We'll use this later.
2014-08-06 17:19:27 +12:00
Robert O'Callahan
bed9de9439 Bug 1048752. Part 17: Rename Get/SetCaretDOMSelection to Get/SetSelection. r=tn
The forward declaration of Selection in nsCaret.h will be used in later patches.
2014-08-06 17:19:27 +12:00
Robert O'Callahan
6fb18233c7 Bug 1048752. Part 16: Move nsFrameSelection::HINT to CaretAssociationHint.h. r=tn
This patch started an attempt to remove nsFrameSelection.h from nsCaret.h
and metastasized into a rather large refactoring patch that removed it
from some other header files as well, and changed nsFrameSelection::HINT
into a global-scope enum with better names. I also converted bools
into CaretAssociationHint in a few places where that was appropriate,
but there are still some more places (GetChildFrameContainingOffset)
where bools need to be converted. I figured this patch was big enough already.
2014-08-06 17:19:27 +12:00
Robert O'Callahan
5bf77116d0 Bug 1048752. Part 14: Split GetGeometry into a static and a non-static version. r=tn
GetGeometry is used in two different ways. Sometimes it's used to get
information about a particular caret. Sometimes it's used to get
information about a particular selection that's not associated with
a caret. Splitting GetGeometry into a non-static version for the former
and a static version for the latter makes this more clear. Also it saves
code since for the latter version we don't have to get an nsCaret first.
2014-08-06 17:19:26 +12:00
Robert O'Callahan
7fc6e3bc4b Bug 1048752. Part 13: Remove GetGeometry's aBidiIndicatorSize. r=tn
Callers always pass null.
2014-08-06 17:19:26 +12:00
Robert O'Callahan
5244a96da8 Bug 1048752. Part 12: Replace mBlinkRate with mIsBlinking. r=tn
We don't need to store the blink rate. Instead we can just fetch it whenever
we need it. However we do need a flag to handle the case where
nsCaret::DrawAtPosition disables blinking.
2014-08-06 17:19:26 +12:00
Robert O'Callahan
af8220e22d Bug 1048752. Part 8: Remove mCaretAspectRatio. r=tn
mCaretAspectRatio doesn't need to be stored. We can recompute it
whenever we need it.
2014-08-06 17:19:25 +12:00
Robert O'Callahan
c72cc5d35d Bug 1048752. Part 7: Remove mCaretWidthCSSPx. r=tn
mCaretWidthCSSPx doesn't need to be stored. We can just recompute it
whenever we need it.
2014-08-06 17:19:25 +12:00