diff --git a/mozilla/editor/base/nsHTMLEditRules.cpp b/mozilla/editor/base/nsHTMLEditRules.cpp
index 6b1d768dac5..eac6d0173de 100644
--- a/mozilla/editor/base/nsHTMLEditRules.cpp
+++ b/mozilla/editor/base/nsHTMLEditRules.cpp
@@ -4087,10 +4087,6 @@ nsHTMLEditRules::FindNearSelectableNode(nsIDOMNode *aSelNode,
|| nsHTMLEditUtils::IsBreak(nearNode)
|| nsHTMLEditUtils::IsImage(nearNode)))
{
- // dont cross any table elements
- if (mEditor->IsTableElement(nearNode))
- return NS_OK;
-
curNode = nearNode;
if (aDirection == nsIEditor::ePrevious)
res = mEditor->GetPriorHTMLNode(curNode, &nearNode);
@@ -4099,11 +4095,49 @@ nsHTMLEditRules::FindNearSelectableNode(nsIDOMNode *aSelNode,
if (NS_FAILED(res)) return res;
}
- if (nearNode) *outSelectableNode = do_QueryInterface(nearNode);
+ if (nearNode)
+ {
+ // dont cross any table elements
+ PRBool bInDifTblElems;
+ res = InDifferentTableElements(nearNode, aSelNode, &bInDifTblElems);
+ if (NS_FAILED(res)) return res;
+ if (bInDifTblElems) return NS_OK;
+
+ // otherwise, ok, we have found a good spot to put the selection
+ *outSelectableNode = do_QueryInterface(nearNode);
+ }
return res;
}
+nsresult
+nsHTMLEditRules::InDifferentTableElements(nsIDOMNode *aNode1, nsIDOMNode *aNode2, PRBool *aResult)
+{
+ if (!aNode1 || !aNode2 || !aResult) NS_ERROR_NULL_POINTER;
+
+ nsCOMPtr tn1, tn2, node = aNode1, temp;
+
+ while (node && !mEditor->IsTableElement(node))
+ {
+ node->GetParentNode(getter_AddRefs(temp));
+ node = temp;
+ }
+ tn1 = node;
+
+ node = aNode2;
+ while (node && !mEditor->IsTableElement(node))
+ {
+ node->GetParentNode(getter_AddRefs(temp));
+ node = temp;
+ }
+ tn2 = node;
+
+ *aResult = (tn1 != tn2);
+
+ return NS_OK;
+}
+
+
nsresult
nsHTMLEditRules::RemoveEmptyNodes()
{
diff --git a/mozilla/editor/base/nsHTMLEditRules.h b/mozilla/editor/base/nsHTMLEditRules.h
index 478fbd7a1e5..cd9292d9c01 100644
--- a/mozilla/editor/base/nsHTMLEditRules.h
+++ b/mozilla/editor/base/nsHTMLEditRules.h
@@ -167,6 +167,7 @@ protected:
PRInt32 aSelOffset,
nsIEditor::EDirection aDirection,
nsCOMPtr *outSelectableNode);
+ nsresult InDifferentTableElements(nsIDOMNode *aNode1, nsIDOMNode *aNode2, PRBool *aResult);
nsresult RemoveEmptyNodes();
nsresult SelectionEndpointInNode(nsIDOMNode *aNode, PRBool *aResult);
nsresult DoTextNodeWhitespace(nsIDOMCharacterData *aTextNode, PRInt32 aStart, PRInt32 aEnd);
diff --git a/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp b/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp
index 6b1d768dac5..eac6d0173de 100644
--- a/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp
+++ b/mozilla/editor/libeditor/html/nsHTMLEditRules.cpp
@@ -4087,10 +4087,6 @@ nsHTMLEditRules::FindNearSelectableNode(nsIDOMNode *aSelNode,
|| nsHTMLEditUtils::IsBreak(nearNode)
|| nsHTMLEditUtils::IsImage(nearNode)))
{
- // dont cross any table elements
- if (mEditor->IsTableElement(nearNode))
- return NS_OK;
-
curNode = nearNode;
if (aDirection == nsIEditor::ePrevious)
res = mEditor->GetPriorHTMLNode(curNode, &nearNode);
@@ -4099,11 +4095,49 @@ nsHTMLEditRules::FindNearSelectableNode(nsIDOMNode *aSelNode,
if (NS_FAILED(res)) return res;
}
- if (nearNode) *outSelectableNode = do_QueryInterface(nearNode);
+ if (nearNode)
+ {
+ // dont cross any table elements
+ PRBool bInDifTblElems;
+ res = InDifferentTableElements(nearNode, aSelNode, &bInDifTblElems);
+ if (NS_FAILED(res)) return res;
+ if (bInDifTblElems) return NS_OK;
+
+ // otherwise, ok, we have found a good spot to put the selection
+ *outSelectableNode = do_QueryInterface(nearNode);
+ }
return res;
}
+nsresult
+nsHTMLEditRules::InDifferentTableElements(nsIDOMNode *aNode1, nsIDOMNode *aNode2, PRBool *aResult)
+{
+ if (!aNode1 || !aNode2 || !aResult) NS_ERROR_NULL_POINTER;
+
+ nsCOMPtr tn1, tn2, node = aNode1, temp;
+
+ while (node && !mEditor->IsTableElement(node))
+ {
+ node->GetParentNode(getter_AddRefs(temp));
+ node = temp;
+ }
+ tn1 = node;
+
+ node = aNode2;
+ while (node && !mEditor->IsTableElement(node))
+ {
+ node->GetParentNode(getter_AddRefs(temp));
+ node = temp;
+ }
+ tn2 = node;
+
+ *aResult = (tn1 != tn2);
+
+ return NS_OK;
+}
+
+
nsresult
nsHTMLEditRules::RemoveEmptyNodes()
{
diff --git a/mozilla/editor/libeditor/html/nsHTMLEditRules.h b/mozilla/editor/libeditor/html/nsHTMLEditRules.h
index 478fbd7a1e5..cd9292d9c01 100644
--- a/mozilla/editor/libeditor/html/nsHTMLEditRules.h
+++ b/mozilla/editor/libeditor/html/nsHTMLEditRules.h
@@ -167,6 +167,7 @@ protected:
PRInt32 aSelOffset,
nsIEditor::EDirection aDirection,
nsCOMPtr *outSelectableNode);
+ nsresult InDifferentTableElements(nsIDOMNode *aNode1, nsIDOMNode *aNode2, PRBool *aResult);
nsresult RemoveEmptyNodes();
nsresult SelectionEndpointInNode(nsIDOMNode *aNode, PRBool *aResult);
nsresult DoTextNodeWhitespace(nsIDOMCharacterData *aTextNode, PRInt32 aStart, PRInt32 aEnd);