From 5d3bd9ef3148f2a16302a679cff3c5a031d33a4e Mon Sep 17 00:00:00 2001 From: "bryner%netscape.com" Date: Sat, 27 Apr 2002 01:20:48 +0000 Subject: [PATCH] Fix shift-tabbing in the case where the first focusable element in the page has a non-text child node. Bug 136495, r=aaronl, sr=jst. git-svn-id: svn://10.0.0.236/trunk@120056 18797224-902f-48f8-a5cc-f745e15eee43 --- .../events/src/nsEventStateManager.cpp | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/mozilla/content/events/src/nsEventStateManager.cpp b/mozilla/content/events/src/nsEventStateManager.cpp index b8f207c3ac9..e96dad75e08 100644 --- a/mozilla/content/events/src/nsEventStateManager.cpp +++ b/mozilla/content/events/src/nsEventStateManager.cpp @@ -4206,44 +4206,50 @@ nsresult nsEventStateManager::GetDocSelectionLocation(nsIContent **aStartContent // If so, the caret is actually sitting in front of the next // logical frame's primary node - so for this case we need to // change caretContent to that node. - nsCOMPtr origStartContent(startContent), rootContent; - mDocument->GetRootContent(getter_AddRefs(rootContent)); - nsAutoString nodeValue; + nsCOMPtr domNode(do_QueryInterface(startContent)); - domNode->GetNodeValue(nodeValue); + PRUint16 nodeType; + domNode->GetNodeType(&nodeType); - nsCOMPtr formControl(do_QueryInterface(startContent)); + if (nodeType == nsIDOMNode::TEXT_NODE) { + nsCOMPtr origStartContent(startContent), rootContent; + mDocument->GetRootContent(getter_AddRefs(rootContent)); + nsAutoString nodeValue; + domNode->GetNodeValue(nodeValue); - if (nodeValue.Length() == *aStartOffset && !formControl && startContent != rootContent) { - // Yes, indeed we were at the end of the last node - nsCOMPtr frameTraversal; + nsCOMPtr formControl(do_QueryInterface(startContent)); - nsCOMPtr trav(do_CreateInstance(kFrameTraversalCID, - &rv)); - NS_ENSURE_SUCCESS(rv, rv); + if (nodeValue.Length() == *aStartOffset && !formControl && startContent != rootContent) { + // Yes, indeed we were at the end of the last node + nsCOMPtr frameTraversal; - rv = trav->NewFrameTraversal(getter_AddRefs(frameTraversal), LEAF, - mPresContext, startFrame); - NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr trav(do_CreateInstance(kFrameTraversalCID, + &rv)); + NS_ENSURE_SUCCESS(rv, rv); - do { - // Get the next logical frame, and set the start of - // focusable elements. Search for focusable elements from there. - // Continue getting next frame until the primary node for the frame - // we are on changes - we don't want to be stuck in the same place - frameTraversal->Next(); - nsISupports* currentItem; - frameTraversal->CurrentItem(¤tItem); - startFrame = NS_STATIC_CAST(nsIFrame*, currentItem); - if (startFrame) { - PRBool endEqualsStart(startContent == endContent); - startFrame->GetContent(getter_AddRefs(startContent)); - if (endEqualsStart) - endContent = startContent; + rv = trav->NewFrameTraversal(getter_AddRefs(frameTraversal), LEAF, + mPresContext, startFrame); + NS_ENSURE_SUCCESS(rv, rv); + + do { + // Get the next logical frame, and set the start of + // focusable elements. Search for focusable elements from there. + // Continue getting next frame until the primary node for the frame + // we are on changes - we don't want to be stuck in the same place + frameTraversal->Next(); + nsISupports* currentItem; + frameTraversal->CurrentItem(¤tItem); + startFrame = NS_STATIC_CAST(nsIFrame*, currentItem); + if (startFrame) { + PRBool endEqualsStart(startContent == endContent); + startFrame->GetContent(getter_AddRefs(startContent)); + if (endEqualsStart) + endContent = startContent; + } + else break; } - else break; + while (startContent == origStartContent); } - while (startContent == origStartContent); } } }