mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-21 01:05:45 +00:00
Bug 1190172 - Back out for now, requested by Masayuki at bug 1191356 comment 23
This commit is contained in:
parent
52f4bc1e37
commit
b75a20d5c8
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user