[WebODF] Adding spec property "setOwnCursor" for Insert/Remove/Split ops
Friedrich W. H. Kossebau
friedrich at kogmbh.com
Wed Jun 19 10:38:13 CEST 2013
Hi Philip,
Am Mittwoch, 19. Juni 2013, 00:34:24 schrieben Sie:
> Hi Friedrich,
>
> The proposal looks good.
>
> Once concern that I did have is that there is potentially not enough
> flexibility. I'm thinking about table insertion specifically where the
> desired location of the cursor when inserting a table is actually within
> the first paragraph in the first cell of the table.
>
> There are two potential ways to address this that immediately come to mind:
>
> 1. Make the setOwnCursor a little more flexible by allowing specific
> placement of the cursor at the completion of an operation. As long as the
> Ops respect the fact that setOwnCursor is RELATIVE to the input position,
> this should cause no hassles for OT adaption on conflict etc. (e.g., an Op
> should not set the cursor beyond the bounds of it's known neighbour hood,
> so for the table, it will insert the cursor within the first paragraph
> itself).
While for simplicity I would prefer to have a single defined position where
the related cursor ends up after insertion (of a table), I do not see any
technical reason against having an option where to place it exactly. So no
problem to add support for that.
> 2. Keep cursor positioning a separate concern from the operation. The
> expectation here would be that an operation is NOT responsible for managing
> cursor position, instead, the upper controller (SessionController) is
> responsible for this. The key advantage of this is that it keeps the notion
> of cursor positioning entirely in the domain of the SessionController,
> rather than requiring each OP to find and manage it's own cursor (or even
> other cursors). I suspect this would help simplify the Ops slightly as they
> would focus more on doing things to the DOM, and would no longer need to
> worry about whether insertion is before or after the cursor etc.
>
> In the example of a table insertion, approach 2 would generate:
> OpInsertTable
> OpMoveCursor (move to first paragraph of new table)
While I would prefer approach 2 as well, due to the less complexity in the
semantics of the ops and the work they have to do, it poses me in front of a
problem I yet have to solve, i.e. to do proper transformations of the
movecursor ops which are intended to put the cursor after the result of the
preceding document manipulation. Because I would need to know how the related
manipulating op is transformed to also properly adapt the moveCursor op. So
this dependency just adds other complexity elsewhere, and here I do not even
have a good idea yet.
Given the example from my initial email, where both users insert at the first
position of an empty document:
At A:
<insertText pos="0" text="a" memberId="A"/><moveCursor pos="1" memberId="A"/>
At B:
<insertText pos="0" text="b" memberId="B"/><moveCursor pos="1" memberId="B"/>
A first sends to server:
Server:
<insertText pos="0" text="a" memberId="A"/><moveCursor pos="1" memberId="A"/>
Now B tries to sync and has to transform the ops from A and its unsynced own
against each other in such a way that the result looks like this when A later
fetches the (transformed) ops from B (via the server):
A:
<insertText pos="0" text="a" memberId="A"/><moveCursor pos="1" memberId="A"/>
<insertText pos="1" text="b" memberId="B"/><moveCursor pos="2" memberId="B"/>
B:
<insertText pos="0" text="b" memberId="B"/><moveCursor pos="1" memberId="B"/>,
<insertText pos="0" text="a" memberId="A"/><moveCursor pos="1" memberId="A"/>
When transforming a moveCursor op against a insert/remove/split (so position
number) changing op, the current transformation logic only changes the
position of a moveCursor op by the number of inserted/removed positions before
the old position of the moveCursor op. But here it would also depend on the
transformation of the preceding document manipulation op, e.g. in the given
example the moveCursor op for cursor of member A on client B should stay at
position 1 and not be adapted by +1 when transformed against the insertText op
of member b at pos 0, because the related insertText op of A was also not
adapted by +1, due to "winning" the tiebreaking in whose insertion should end
up at position 0.
Will think some more about it, just giving a first reply.
Cheers
Friedrich
--
Friedrich W. H. Kossebau // KO GmbH
http://kogmbh.com/legal/
More information about the WebODF
mailing list