Re: Proposed errata for DOM2 Range regarding insertNode()

2008-06-08 Thread Jonas Sicking


Ian Hickson wrote:


Chaals, please see the end of this message.

On Wed, 28 May 2008, Jonas Sicking wrote:
It seems to me that everyone agrees that insertNode() was always 
intended to insert a node _into_ the range, and that the collapsed 
case was simply lost between the cracks when the DOM WG was writing 
the spec (much as was interaction with mutation events, for instance).
Everyone who? And based on what? I don't see anything in the spec that 
suggests that. And as Olli pointed out there is clearly language in the 
spec that indicates that the inserted node would be after the range in 
the collapsed case.


Well, everyone except you and Olli apparently. :-)


Who is everyone? I've only seen you stating that the spec can be 
interpreted different ways after Olli pointed out what the definition of 
context tree is.


Do you really think that it was intended for insertNode() to act 
differently when the range was collapsed than when the range wasn't 
collapsed, with respect to whether the inserted node ends up in the range 
or not?


Act differently is a matter of how you view it.

I guess I'm fine with making the change to the spec, but it would be a 
change and not an errata.


I'm not sure what the distinction is.


W3C has in the past been very reluctant to making changes to specs, even 
when specs have been incompatible with the web.


If we decide that it's ok to make functional changes to the spec we're 
opening the flood gates for many more changes than merely clarifications.


/ Jonas



Re: Proposed errata for DOM2 Range regarding insertNode()

2008-06-06 Thread Ian Hickson


Chaals, please see the end of this message.

On Wed, 28 May 2008, Jonas Sicking wrote:
  
  It seems to me that everyone agrees that insertNode() was always 
  intended to insert a node _into_ the range, and that the collapsed 
  case was simply lost between the cracks when the DOM WG was writing 
  the spec (much as was interaction with mutation events, for instance).
 
 Everyone who? And based on what? I don't see anything in the spec that 
 suggests that. And as Olli pointed out there is clearly language in the 
 spec that indicates that the inserted node would be after the range in 
 the collapsed case.

Well, everyone except you and Olli apparently. :-)

Do you really think that it was intended for insertNode() to act 
differently when the range was collapsed than when the range wasn't 
collapsed, with respect to whether the inserted node ends up in the range 
or not?


 I guess I'm fine with making the change to the spec, but it would be a 
 change and not an errata.

I'm not sure what the distinction is.


 And if we're making changes anyway, I would requests that we make 
 NodeIterators behave like TreeWalkers as far as the returnvalue for the 
 NodeFilter goes. That is both more useful and easier to implement since 
 it allows more code reuse.

I recommend putting this forward as a separate errata. I only suggested 
this one because implementations seem to be differing on how to implement 
that part of the spec, and it seemed like it would be worth having a cycle 
that didn't require finding an editor to resolve the problem.

On the long term I do think we need to get Traversal Range rewritten with 
strict conformance requirements in mind.


On Thu, 29 May 2008, Olli Pettay wrote:
 
 The current version of the spec handles dom mutations consistently 
 (whether using node.insertBefore/appendChild or range.insertNode) and 
 that is not something I'd like to lose.

This seems like a consistency that would hurt the authors, though. What's 
the use case for insertNode() inserting after the range?


 If that is changed, the insertNode part of the following wouldn't be
 true anymore (2.12):
 Any mutation of the document tree which affect Ranges can be considered 
 to be a combination of basic deletion and insertion operations. In fact, 
 it can be convenient to think of those operations as being accomplished 
 using the deleteContents() and insertNode() Range methods and, in the 
 case of Text mutations, the splitText() and normalize() methods.

Indeed.


I do think that the spec intended the behaviour that I am proposing we 
clarify in errata, though I agree that it could be read otherwise. I 
honestly don't see any reason for the behaviour you advocate, it seems 
confusing, not useful, and not in line with the intent of the spec.

However, I'm not sure how to make further progress if you disagree to this 
change. It would be helpful if we could get a working group decision on 
this so that I could know whether the Acid3 test should be changed.

-- 
Ian Hickson   U+1047E)\._.,--,'``.fL
http://ln.hixie.ch/   U+263A/,   _.. \   _\  ;`._ ,.
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'



Re: Proposed errata for DOM2 Range regarding insertNode()

2008-05-28 Thread Olli Pettay


Ian Hickson wrote:

On Fri, 23 May 2008, Olli Pettay wrote:

So I'm not sure the errata for this issue is actually needed.


It seems to me that everyone agrees that insertNode() was always intended
to insert a node _into_ the range, and that the collapsed case was simply
lost between the cracks when the DOM WG was writing the spec (much as was
interaction with mutation events, for instance). While I agree that the
spec could be read as saying that the node is inserted after the range
when it is collapsed, I don't think we want that behaviour, nor that it
was intended. Do you actually think that behaviour is preferred to the
insertion behaviour?


The current version of the spec handles dom mutations consistently
(whether using node.insertBefore/appendChild or range.insertNode)
and that is not something I'd like to lose.

If that is changed, the insertNode part of the following wouldn't be
true anymore (2.12):
Any mutation of the document tree which affect Ranges can be considered 
to be a combination of basic deletion and insertion operations. In fact, 
it can be convenient to think of those operations as being accomplished 
using the deleteContents() and insertNode() Range methods and, in the 
case of Text mutations, the splitText() and normalize() methods.



Let's have a testcase [1]:
rootelement1/element2//root
and collapsed range is between element1 and element2.

element3 is inserted using the current version of insertNode():
rootelement1/element3/element2//root
Range stays collapsed and is pointed right after element1.

If element3 is inserted using root.insertBefore(element3, element2):
rootelement1/element3/element2//root
Range stays collapsed and is pointed right after element1, so the same
as with insertNode().

Now, if insertNode starts to work differently when range is collapsed 
the result would be:
rootelement1/element3/element2//root, but range wouldn't be 
collapsed anymore, instead start boundary point would be after element1
and end boundary point after element3. And this means that mutation 
can't be thought of ...as being accomplished using ... insertNode()

Range method...
Or is there some combination of insertNode()s and deleteContents()s
which would lead to the collapsed range after element1/?


FF2, FF3, Opera9.2x and Opera9.5b have the, IMO, correct behavior,
Safari3.1 doesn't nor does ACID3'ed-Opera[2]


-Olli

[1] http://mozilla.pettay.fi/moztests/range_test.xhtml
[2] http://labs.opera.com/news/2008/03/28/



Re: Proposed errata for DOM2 Range regarding insertNode()

2008-05-27 Thread Ian Hickson


Since the idea of making it clear that insertNode() inserts the node 
inside the range even if the range is collapsed seems to have received a 
somewhat positive response, I'd like to propose the following actual 
errata text:

| DOM Level 2 Traversal and Range
| 
| range-2. 2008-06-... [clarification]. Range.insertNode
| 
| The sentence:
| 
|The node is inserted at the start boundary-point of the Range, without 
|modifying it.
| 
| Should read:
| 
|The node is inserted at the start boundary-point of the Range, without 
|modifying the start boundary-point. If the range is collapsed, the 
|offset of the Range's end boundary-point will be increased so that it 
|is before the same node or character as it was before the insertion.

This uses the language style of the spec as it stands today (we can worry 
about making the spec use RFC2119 terminology when we rewrite it later; 
doing that now too would be a big rathole IMHO).

Chaals, can we put this to the working group as a proposed errata?


On Wed, 14 May 2008, Boris Zbarsky wrote:
  
   [discussion regarding mutation event timing]
 
  For example regular old insertions and deletions near ranges cause 
  changes to the range values but the spec doesn't say if this is before 
  or after the events.
 
 I think it's pretty clear that it should be when the actual mutation 
 occurs (so before the events for insert cases and after for removal 
 cases), but that does mean that one can't implement Range on top of DOM 
 MutationEvents.  Then again, there's no much one can implement on top of 
 them, so that's OK, I think.
 
  It seems that for sanity we should say it happens before, if we 
  specify this. Should we do this as a separate errata?
 
 I just wanted to point out that we have to be very careful in how we 
 phrase this erratum (which I agree is a possibly useful one): we 
 basically want to perform the insertion, then before firing the mutation 
 event adjust the insertion endpoint after all the nodes we just 
 inserted.  Or something.  In a UA that would fire multiple events here 
 when inserting a DocumentFragment, we might lose no matter what we try 
 to do.

I'm not sure what to do about mutation events. I think it may be wiser to 
punt on this or at least deal with it in a separate errata.


On Fri, 23 May 2008, Olli Pettay wrote:

 So I'm not sure the errata for this issue is actually needed.

It seems to me that everyone agrees that insertNode() was always intended 
to insert a node _into_ the range, and that the collapsed case was simply 
lost between the cracks when the DOM WG was writing the spec (much as was 
interaction with mutation events, for instance). While I agree that the 
spec could be read as saying that the node is inserted after the range 
when it is collapsed, I don't think we want that behaviour, nor that it 
was intended. Do you actually think that behaviour is preferred to the 
insertion behaviour?

-- 
Ian Hickson   U+1047E)\._.,--,'``.fL
http://ln.hixie.ch/   U+263A/,   _.. \   _\  ;`._ ,.
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'



Re: Proposed errata for DOM2 Range regarding insertNode()

2008-05-23 Thread Olli Pettay


Olli Pettay wrote:

Ian Hickson wrote:

The test verifies that when you call insertNode() on a range, the node
that is passed is inserted into the range, as is required by DOM2 range
section 2.9. Inserting Content, sentences 1 and 2 (before and after the
code snippet).


The 2nd sentence doesn't require adding node to range. It talks about
context tree which isn't the same thing as range.

-Olli



A node may be inserted into a Range using the following method:
- 'may' is pretty vague.

The insertNode() method inserts the specified node into the Range's 
context tree. 

- In 2.2.1 ... the content of a Range must be entirely within the
  subtree rooted by a single Document, DocumentFragment or Attr Node.
  This common ancestor container is known as the root container of the
  Range. The tree rooted by the root container is known as the Range's
  context tree.
  So that doesn't say that the node is inserted to Range, but to
  context tree.

The node is inserted at the start boundary-point of the Range, without 
modifying it.

What does the 'it' actually refer to? Boundary-point or Range or node?
And since end boundary-point isn't mentioned, one could argue that the
behavior defined in 2.12.1 should be used. When the range is collapsed,
the following:
  Note that when content is inserted at a boundary-point, it is
  ambiguous as to where the boundary-point should be repositioned if
  its relative position is to be maintained. There are two
  possibilities: at the start or at the end of the newly inserted
  content. We have chosen that in this case neither the container nor
  offset of the boundary-point is changed. As a result, the
  boundary-point will be positioned at the start of the newly inserted
  content.



-Olli




Re: Proposed errata for DOM2 Range regarding insertNode()

2008-05-23 Thread Olli Pettay


Olli Pettay wrote:


Olli Pettay wrote:

Ian Hickson wrote:

The test verifies that when you call insertNode() on a range, the node
that is passed is inserted into the range, as is required by DOM2 range
section 2.9. Inserting Content, sentences 1 and 2 (before and after the
code snippet).


The 2nd sentence doesn't require adding node to range. It talks about
context tree which isn't the same thing as range.

-Olli



A node may be inserted into a Range using the following method:
- 'may' is pretty vague.

The insertNode() method inserts the specified node into the Range's
context tree. 
- In 2.2.1 ... the content of a Range must be entirely within the
subtree rooted by a single Document, DocumentFragment or Attr Node.
This common ancestor container is known as the root container of the
Range. The tree rooted by the root container is known as the Range's
context tree.
So that doesn't say that the node is inserted to Range, but to
context tree.

The node is inserted at the start boundary-point of the Range, without
modifying it.
What does the 'it' actually refer to? Boundary-point or Range or node?
And since end boundary-point isn't mentioned, one could argue that the
behavior defined in 2.12.1 should be used. When the range is collapsed,
the following:
Note that when content is inserted at a boundary-point, it is
ambiguous as to where the boundary-point should be repositioned if
its relative position is to be maintained. There are two
possibilities: at the start or at the end of the newly inserted
content. We have chosen that in this case neither the container nor
offset of the boundary-point is changed. As a result, the
boundary-point will be positioned at the start of the newly inserted
content.



-Olli




So I'm not sure the errata for this issue is actually needed.
(In which case ACID3 should be changed)




Re: Proposed errata for DOM2 Range regarding insertNode()

2008-05-14 Thread Olli Pettay


Ian Hickson wrote:

DOM2 Range says of the insertNode() method that A node may be inserted
into a Range using the following method. However, if the range is
collapsed, according to a strict reading of the specification, calling
insertNode() actually inserts the node _after_ the range. I propose that
we change the spec to explicitly say that if you call insertNode() on a
collapsed range, the end point offset is increased by one, as if the node
was inserted before the end point,
inserted node can be document fragment in which case end offset should 
be increased more than one.




which I believe to be the intent of the
specification. This is implemented by Opera and WebKit already, and is
tested by Acid3.


Gecko does what the current spec says.


If the working group chair will forgive me, I suggest we set a deadline of
May 21st (a week from today) at which point if there have been no
objections raised we go ahead and make the change to the DOM2 errata.

Does web content rely on the current spec behavior?
Did Webkit or Opera change their behavior just to pass ACID3 (but not to 
follow Range spec)?




-Olli



Re: Proposed errata for DOM2 Range regarding insertNode()

2008-05-14 Thread Boris Zbarsky


Ian Hickson wrote:
I propose that we change the spec to explicitly say that if you call insertNode() on a 
collapsed range, the end point offset is increased by one


Increased at what point in time, exactly?  Specifically, if there is a 
DOMNodeInserted listener that repositions the range when the node insertion 
happens, or even mutates the DOM, what is the expected behavior?


-Boris



Re: Proposed errata for DOM2 Range regarding insertNode()

2008-05-14 Thread Robert Sayre

On Wed, May 14, 2008 at 6:15 PM, Ian Hickson [EMAIL PROTECTED] wrote:


 To my knowledge, very little Web content relies on this spec at all.
 That's why Acid3 tested it, to make it interoperable enough that it could
 be used. :-)

I thought Acid3 tested things that have been written down for at least
5 years or something like that.

confused,

Rob

-- 

Robert Sayre

I would have written a shorter letter, but I did not have the time.



Re: Proposed errata for DOM2 Range regarding insertNode()

2008-05-14 Thread Robert Sayre

On Wed, May 14, 2008 at 9:02 PM, Ian Hickson [EMAIL PROTECTED] wrote:

 As I said in the very first e-mail on this subject, that's what I'd like
 to do. However, that's a significantly higher cost (years vs weeks) than
 releasing an errata, and it was my impression that the Mozilla community
 would like a quick turnaround on this.

It looks to me like you're retroactively specifying something in your
test. I asked a simple question to determine whether that was the
case, since I would like to know the exact nature of the bugs Google
is (rather pompously) flaming us for.[1]

If there is disagreement about a change to normative behavior, it
seems like the right thing to do would be to discuss it, not pick one
interpretation and try to jam it through as errata. I don't see how
one can claim the spec can be interpreted both ways, but also that the
intent is clear. Is one of the possible interpretations a real
stretch?

[1] http://diveintomark.org/archives/2008/05/07/when-the-fall-is-all-thats-left

-- 

Robert Sayre

I would have written a shorter letter, but I did not have the time.



Re: Proposed errata for DOM2 Range regarding insertNode()

2008-05-14 Thread Ian Hickson

On Wed, 14 May 2008, Robert Sayre wrote:
 On Wed, May 14, 2008 at 9:02 PM, Ian Hickson [EMAIL PROTECTED] wrote:
 
  As I said in the very first e-mail on this subject, that's what I'd 
  like to do. However, that's a significantly higher cost (years vs 
  weeks) than releasing an errata, and it was my impression that the 
  Mozilla community would like a quick turnaround on this.
 
 It looks to me like you're retroactively specifying something in your 
 test.

The test verifies that when you call insertNode() on a range, the node 
that is passed is inserted into the range, as is required by DOM2 range 
section 2.9. Inserting Content, sentences 1 and 2 (before and after the 
code snippet).

These sentences are contradicted by the more generic sentences in section 
2.12.1. Insertions, which don't take insertNode() into account for the 
case of a collapsed range, and thus end up not implementing the 
requirement in the former section.

I hold that the intent of the spec is clear, in that it would be pretty 
dumb for an API for inserting nodes into a range didn't actually insert 
nodes into a range; however, I agree that it is possible to interpret the 
spec in a way that assums that the generic rules in the latter section 
override the statements in the former section, hence my proposal that we 
raise this as an errata.


 If there is disagreement about a change to normative behavior, it seems 
 like the right thing to do would be to discuss it, not pick one 
 interpretation and try to jam it through as errata.

Right, that's why I raised on the list, so that we can discuss it.

-- 
Ian Hickson   U+1047E)\._.,--,'``.fL
http://ln.hixie.ch/   U+263A/,   _.. \   _\  ;`._ ,.
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'



Re: Proposed errata for DOM2 Range regarding insertNode()

2008-05-14 Thread Boris Zbarsky


Ian Hickson wrote:
DOM2 Range doesn't define anything to this level of detail yet, 
unfortunately.


Indeed.  The wonders of Conway's Law...

Nevertheless, this question is somewhat important in terms of deciding where the 
range should be positioned.


For example regular old insertions and deletions near 
ranges cause changes to the range values but the spec doesn't say if this 
is before or after the events.


I think it's pretty clear that it should be when the actual mutation occurs (so 
before the events for insert cases and after for removal cases), but that does 
mean that one can't implement Range on top of DOM MutationEvents.  Then again, 
there's no much one can implement on top of them, so that's OK, I think.


It seems that for sanity we should say it happens before, if we specify 
this. Should we do this as a separate errata?


I just wanted to point out that we have to be very careful in how we phrase this 
erratum (which I agree is a possibly useful one): we basically want to perform 
the insertion, then before firing the mutation event adjust the insertion 
endpoint after all the nodes we just inserted.  Or something.  In a UA that 
would fire multiple events here when inserting a DocumentFragment, we might lose 
no matter what we try to do.


-Boris