Bug 1190172 - Back out for now, requested by Masayuki at bug 1191356 comment 23

This commit is contained in:
Aryeh Gregor 2016-04-20 20:44:48 +03:00
parent 52f4bc1e37
commit b75a20d5c8
3 changed files with 80 additions and 58 deletions

View File

@ -2710,14 +2710,22 @@ nsHTMLEditRules::JoinBlocks(nsIContent& aLeftNode, nsIContent& aRightNode,
nsCOMPtr<Element> editorRoot = mHTMLEditor->GetEditorRoot();
if (!editorRoot || &aLeftNode != editorRoot) {
nsCOMPtr<nsIContent> splittedPreviousContent;
res = mHTMLEditor->SplitStyleAbovePoint(address_of(previousContentParent),
nsCOMPtr<nsIDOMNode> previousContentParentDOM =
GetAsDOMNode(previousContentParent);
nsCOMPtr<nsIDOMNode> splittedPreviousContentDOM;
res = mHTMLEditor->SplitStyleAbovePoint(address_of(previousContentParentDOM),
&previousContentOffset,
nullptr, nullptr, nullptr,
getter_AddRefs(splittedPreviousContent));
address_of(splittedPreviousContentDOM));
NS_ENSURE_SUCCESS(res, res);
previousContentParent = do_QueryInterface(previousContentParentDOM);
NS_ENSURE_STATE(previousContentParent || !previousContentParentDOM);
if (splittedPreviousContent) {
if (splittedPreviousContentDOM) {
nsCOMPtr<nsINode> splittedPreviousContent =
do_QueryInterface(splittedPreviousContentDOM);
NS_ENSURE_STATE(splittedPreviousContent ||
!splittedPreviousContentDOM);
previousContentParent = splittedPreviousContent->GetParentNode();
previousContentOffset = previousContentParent ?
previousContentParent->IndexOf(splittedPreviousContent) : -1;

View File

@ -664,11 +664,12 @@ protected:
nsresult SplitStyleAboveRange(nsRange* aRange,
nsIAtom *aProperty,
const nsAString *aAttribute);
nsresult SplitStyleAbovePoint(nsCOMPtr<nsINode>* aNode, int32_t* aOffset,
nsIAtom* aProperty,
const nsAString* aAttribute,
nsIContent** aOutLeftNode = nullptr,
nsIContent** aOutRightNode = nullptr);
nsresult SplitStyleAbovePoint(nsCOMPtr<nsIDOMNode> *aNode,
int32_t *aOffset,
nsIAtom *aProperty,
const nsAString *aAttribute,
nsCOMPtr<nsIDOMNode> *outLeftNode = nullptr,
nsCOMPtr<nsIDOMNode> *outRightNode = nullptr);
nsresult ApplyDefaultProperties();
nsresult RemoveStyleInside(nsIDOMNode *aNode,
nsIAtom *aProperty,

View File

@ -523,25 +523,29 @@ nsHTMLEditor::SplitStyleAboveRange(nsRange* inRange, nsIAtom* aProperty,
{
NS_ENSURE_TRUE(inRange, NS_ERROR_NULL_POINTER);
nsresult res;
nsCOMPtr<nsIDOMNode> startNode, endNode, origStartNode;
int32_t startOffset, endOffset;
nsCOMPtr<nsINode> startNode = inRange->GetStartParent();
int32_t startOffset = inRange->StartOffset();
nsCOMPtr<nsINode> endNode = inRange->GetEndParent();
int32_t endOffset = inRange->EndOffset();
res = inRange->GetStartContainer(getter_AddRefs(startNode));
NS_ENSURE_SUCCESS(res, res);
res = inRange->GetStartOffset(&startOffset);
NS_ENSURE_SUCCESS(res, res);
res = inRange->GetEndContainer(getter_AddRefs(endNode));
NS_ENSURE_SUCCESS(res, res);
res = inRange->GetEndOffset(&endOffset);
NS_ENSURE_SUCCESS(res, res);
nsCOMPtr<nsINode> origStartNode = startNode;
origStartNode = startNode;
// split any matching style nodes above the start of range
{
nsAutoTrackDOMPoint tracker(mRangeUpdater, address_of(endNode), &endOffset);
res = SplitStyleAbovePoint(address_of(startNode), &startOffset, aProperty,
aAttribute);
res = SplitStyleAbovePoint(address_of(startNode), &startOffset, aProperty, aAttribute);
NS_ENSURE_SUCCESS(res, res);
}
// second verse, same as the first...
res = SplitStyleAbovePoint(address_of(endNode), &endOffset, aProperty,
aAttribute);
res = SplitStyleAbovePoint(address_of(endNode), &endOffset, aProperty, aAttribute);
NS_ENSURE_SUCCESS(res, res);
// reset the range
@ -551,32 +555,30 @@ nsHTMLEditor::SplitStyleAboveRange(nsRange* inRange, nsIAtom* aProperty,
return res;
}
nsresult
nsHTMLEditor::SplitStyleAbovePoint(nsCOMPtr<nsINode>* aNode,
int32_t* aOffset,
// null here means we split all properties
nsIAtom* aProperty,
const nsAString* aAttribute,
nsIContent** aOutLeftNode,
nsIContent** aOutRightNode)
nsresult nsHTMLEditor::SplitStyleAbovePoint(nsCOMPtr<nsIDOMNode> *aNode,
int32_t *aOffset,
nsIAtom *aProperty, // null here means we split all properties
const nsAString *aAttribute,
nsCOMPtr<nsIDOMNode> *outLeftNode,
nsCOMPtr<nsIDOMNode> *outRightNode)
{
MOZ_ASSERT(aNode && *aNode && aOffset);
NS_ENSURE_TRUE((*aNode)->IsContent(), NS_OK);
// Split any matching style nodes above the node/offset
OwningNonNull<nsIContent> node = *(*aNode)->AsContent();
NS_ENSURE_TRUE(aNode && *aNode && aOffset, NS_ERROR_NULL_POINTER);
if (outLeftNode) *outLeftNode = nullptr;
if (outRightNode) *outRightNode = nullptr;
// split any matching style nodes above the node/offset
nsCOMPtr<nsIContent> node = do_QueryInterface(*aNode);
NS_ENSURE_STATE(node);
int32_t offset;
bool useCSS = IsCSSEnabled();
bool isSet;
while (!IsBlockNode(node) && node->GetParent() &&
IsEditable(node->GetParent())) {
while (node && !IsBlockNode(node) && node->GetParentNode() &&
IsEditable(node->GetParentNode())) {
isSet = false;
if (useCSS && mHTMLCSSUtils->IsCSSEditableProperty(node, aProperty,
aAttribute)) {
// The HTML style defined by aProperty/aAttribute has a CSS equivalence
// in this implementation for the node; let's check if it carries those
// CSS styles
if (useCSS && mHTMLCSSUtils->IsCSSEditableProperty(node, aProperty, aAttribute)) {
// the HTML style defined by aProperty/aAttribute has a CSS equivalence
// in this implementation for the node; let's check if it carries those css styles
nsAutoString firstValue;
mHTMLCSSUtils->IsCSSEquivalentToHTMLInlineStyleSet(GetAsDOMNode(node),
aProperty, aAttribute, isSet, firstValue, nsHTMLCSSUtils::eSpecified);
@ -589,18 +591,26 @@ nsHTMLEditor::SplitStyleAbovePoint(nsCOMPtr<nsINode>* aNode,
(!aProperty && NodeIsProperty(GetAsDOMNode(node))) ||
// or the style is specified in the style attribute
isSet) {
// Found a style node we need to split
int32_t offset = SplitNodeDeep(*node, *(*aNode)->AsContent(), *aOffset,
EmptyContainers::yes, aOutLeftNode,
aOutRightNode);
// found a style node we need to split
nsCOMPtr<nsIContent> outLeftContent, outRightContent;
nsCOMPtr<nsIContent> nodeParam = do_QueryInterface(*aNode);
NS_ENSURE_STATE(nodeParam || !*aNode);
offset = SplitNodeDeep(*node, *nodeParam, *aOffset, EmptyContainers::yes,
getter_AddRefs(outLeftContent),
getter_AddRefs(outRightContent));
NS_ENSURE_TRUE(offset != -1, NS_ERROR_FAILURE);
// reset startNode/startOffset
*aNode = node->GetParent();
*aNode = GetAsDOMNode(node->GetParent());
*aOffset = offset;
if (outLeftNode) {
*outLeftNode = GetAsDOMNode(outLeftContent);
}
if (outRightNode) {
*outRightNode = GetAsDOMNode(outRightContent);
}
}
node = node->GetParent();
}
return NS_OK;
}
@ -608,14 +618,11 @@ nsresult
nsHTMLEditor::ClearStyle(nsCOMPtr<nsIDOMNode>* aNode, int32_t* aOffset,
nsIAtom* aProperty, const nsAString* aAttribute)
{
nsCOMPtr<nsINode> node = do_QueryInterface(*aNode);
nsCOMPtr<nsIContent> leftNode, rightNode;
nsresult res = SplitStyleAbovePoint(address_of(node), aOffset, aProperty,
aAttribute, getter_AddRefs(leftNode),
getter_AddRefs(rightNode));
*aNode = GetAsDOMNode(node);
nsCOMPtr<nsIDOMNode> leftNode, rightNode, tmp;
nsresult res = SplitStyleAbovePoint(aNode, aOffset, aProperty, aAttribute,
address_of(leftNode),
address_of(rightNode));
NS_ENSURE_SUCCESS(res, res);
if (leftNode) {
bool bIsEmptyNode;
IsEmptyNode(leftNode, &bIsEmptyNode, false, true);
@ -626,7 +633,10 @@ nsHTMLEditor::ClearStyle(nsCOMPtr<nsIDOMNode>* aNode, int32_t* aOffset,
}
}
if (rightNode) {
nsCOMPtr<nsINode> secondSplitParent = GetLeftmostChild(rightNode);
nsCOMPtr<nsINode> rightNode_ = do_QueryInterface(rightNode);
NS_ENSURE_STATE(rightNode_);
nsCOMPtr<nsIDOMNode> secondSplitParent =
GetAsDOMNode(GetLeftmostChild(rightNode_));
// don't try to split non-containers (br's, images, hr's, etc)
if (!secondSplitParent) {
secondSplitParent = rightNode;
@ -638,18 +648,21 @@ nsHTMLEditor::ClearStyle(nsCOMPtr<nsIDOMNode>* aNode, int32_t* aOffset,
NS_ENSURE_STATE(savedBR);
}
secondSplitParent = secondSplitParent->GetParentNode();
secondSplitParent->GetParentNode(getter_AddRefs(tmp));
secondSplitParent = tmp;
}
*aOffset = 0;
res = SplitStyleAbovePoint(address_of(secondSplitParent),
aOffset, aProperty, aAttribute,
getter_AddRefs(leftNode),
getter_AddRefs(rightNode));
address_of(leftNode), address_of(rightNode));
NS_ENSURE_SUCCESS(res, res);
// should be impossible to not get a new leftnode here
nsCOMPtr<nsINode> newSelParent = GetLeftmostChild(leftNode);
nsCOMPtr<nsINode> leftNode_ = do_QueryInterface(leftNode);
NS_ENSURE_TRUE(leftNode_, NS_ERROR_FAILURE);
nsCOMPtr<nsINode> newSelParent = GetLeftmostChild(leftNode_);
if (!newSelParent) {
newSelParent = leftNode;
newSelParent = do_QueryInterface(leftNode);
NS_ENSURE_STATE(newSelParent);
}
// If rightNode starts with a br, suck it out of right node and into
// leftNode. This is so we you don't revert back to the previous style
@ -675,7 +688,7 @@ nsHTMLEditor::ClearStyle(nsCOMPtr<nsIDOMNode>* aNode, int32_t* aOffset,
// selection.
nsAutoTrackDOMPoint tracker(mRangeUpdater,
address_of(newSelParent), &newSelOffset);
res = RemoveStyleInside(GetAsDOMNode(leftNode), aProperty, aAttribute);
res = RemoveStyleInside(leftNode, aProperty, aAttribute);
NS_ENSURE_SUCCESS(res, res);
}
// reset our node offset values to the resulting new sel point