Closed
Bug 1407447
Opened 7 years ago
Closed 7 years ago
Remove the call to nsINode::GetChildAt() from HTMLEditor::DoInsertHTMLWithContext()
Categories
(Core :: DOM: Editor, enhancement)
Core
DOM: Editor
Tracking
()
RESOLVED
FIXED
mozilla58
Tracking | Status | |
---|---|---|
firefox58 | --- | fixed |
People
(Reporter: ehsan.akhgari, Assigned: ehsan.akhgari)
References
Details
Attachments
(2 files)
9.27 KB,
patch
|
masayuki
:
review+
|
Details | Diff | Splinter Review |
2.11 KB,
patch
|
masayuki
:
review+
|
Details | Diff | Splinter Review |
No description provided.
Assignee | ||
Comment 1•7 years ago
|
||
Attachment #8917623 -
Flags: review?(masayuki)
Assignee | ||
Comment 2•7 years ago
|
||
Attachment #8917624 -
Flags: review?(masayuki)
Comment 3•7 years ago
|
||
Comment on attachment 8917623 [details] [diff] [review]
Part 1: Remove the call to nsINode::GetChildAt() from HTMLEditor::DoInsertHTMLWithContext()
> nsresult
> HTMLEditor::InsertNodeAtPoint(nsIDOMNode* aNode,
> nsCOMPtr<nsIDOMNode>* ioParent,
> int32_t* ioOffset,
>- bool aNoEmptyNodes)
>+ bool aNoEmptyNodes,
>+ nsCOMPtr<nsIDOMNode>* ioChildAtOffset)
> {
> nsCOMPtr<nsIContent> node = do_QueryInterface(aNode);
> NS_ENSURE_TRUE(node, NS_ERROR_NULL_POINTER);
> NS_ENSURE_TRUE(ioParent, NS_ERROR_NULL_POINTER);
> NS_ENSURE_TRUE(*ioParent, NS_ERROR_NULL_POINTER);
> NS_ENSURE_TRUE(ioOffset, NS_ERROR_NULL_POINTER);
>+ bool isDocumentFragment = false;
>+ if (ioChildAtOffset) {
>+ *ioChildAtOffset = aNode;
>+ uint16_t nodeType = 0;
>+ if (NS_SUCCEEDED(aNode->GetNodeType(&nodeType)) &&
>+ nodeType == nsIDOMNode::DOCUMENT_FRAGMENT_NODE) {
>+ // For document fragments, we can't return aNode itself in
>+ // *ioChildAtOffset, so we have to find out the inserted child after
>+ // the insertion is successfully finished.
>+ isDocumentFragment = true;
Interesting. Your change makes sense for safe. However, how do we get here? I have no idea how document fragment node is in editor.
>@@ -538,21 +538,25 @@ HTMLEditor::DoInsertHTMLWithContext(const nsAString& aInputString,
> }
>
> // Assume failure means no legal parent in the document hierarchy,
> // try again with the parent of curNode in the paste hierarchy.
> nsCOMPtr<nsIDOMNode> parent;
> while (NS_FAILED(rv) && curNode) {
> curNode->GetParentNode(getter_AddRefs(parent));
> if (parent && !TextEditUtils::IsBody(parent)) {
>- rv = InsertNodeAtPoint(parent, address_of(parentNode), &offsetOfNewNode, true);
>+ rv = InsertNodeAtPoint(parent, address_of(parentNode), &offsetOfNewNode, true,
>+ address_of(lastInsertNode));
> if (NS_SUCCEEDED(rv)) {
> bDidInsert = true;
> insertedContextParent = parent;
>- lastInsertNode = GetChildAt(parentNode, offsetOfNewNode);
>+#ifdef DEBUG
>+ nsCOMPtr<nsINode> node = do_QueryInterface(parentNode);
>+ MOZ_ASSERT(lastInsertNode == GetAsDOMNode(node->GetChildAt(offsetOfNewNode)));
>+#endif
Those lines are too long. However, it's okay to keep them since there are a lot of long lines in this file. So, I'll file a clean up bug.
Attachment #8917623 -
Flags: review?(masayuki) → review+
Updated•7 years ago
|
Attachment #8917624 -
Flags: review?(masayuki) → review+
Assignee | ||
Comment 4•7 years ago
|
||
(In reply to Masayuki Nakano [:masayuki] (JST, +0900) from comment #3)
> Comment on attachment 8917623 [details] [diff] [review]
> Part 1: Remove the call to nsINode::GetChildAt() from
> HTMLEditor::DoInsertHTMLWithContext()
>
> > nsresult
> > HTMLEditor::InsertNodeAtPoint(nsIDOMNode* aNode,
> > nsCOMPtr<nsIDOMNode>* ioParent,
> > int32_t* ioOffset,
> >- bool aNoEmptyNodes)
> >+ bool aNoEmptyNodes,
> >+ nsCOMPtr<nsIDOMNode>* ioChildAtOffset)
> > {
> > nsCOMPtr<nsIContent> node = do_QueryInterface(aNode);
> > NS_ENSURE_TRUE(node, NS_ERROR_NULL_POINTER);
> > NS_ENSURE_TRUE(ioParent, NS_ERROR_NULL_POINTER);
> > NS_ENSURE_TRUE(*ioParent, NS_ERROR_NULL_POINTER);
> > NS_ENSURE_TRUE(ioOffset, NS_ERROR_NULL_POINTER);
> >+ bool isDocumentFragment = false;
> >+ if (ioChildAtOffset) {
> >+ *ioChildAtOffset = aNode;
> >+ uint16_t nodeType = 0;
> >+ if (NS_SUCCEEDED(aNode->GetNodeType(&nodeType)) &&
> >+ nodeType == nsIDOMNode::DOCUMENT_FRAGMENT_NODE) {
> >+ // For document fragments, we can't return aNode itself in
> >+ // *ioChildAtOffset, so we have to find out the inserted child after
> >+ // the insertion is successfully finished.
> >+ isDocumentFragment = true;
>
> Interesting. Your change makes sense for safe. However, how do we get here?
> I have no idea how document fragment node is in editor.
We create document fragments for pasting for example here: <https://searchfox.org/mozilla-central/rev/31606bbabc50b08895d843b9f5f3da938ccdfbbf/editor/libeditor/HTMLEditorDataTransfer.cpp#205>.
Pushed by eakhgari@mozilla.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/69f90636cb21
Part 1: Remove the call to nsINode::GetChildAt() from HTMLEditor::DoInsertHTMLWithContext(); r=masayuki
https://hg.mozilla.org/integration/mozilla-inbound/rev/e8a385cd8ddd
Part 2: Remove some dead code; r=masayuki
![]() |
||
Comment 6•7 years ago
|
||
bugherder |
https://hg.mozilla.org/mozilla-central/rev/69f90636cb21
https://hg.mozilla.org/mozilla-central/rev/e8a385cd8ddd
Status: NEW → RESOLVED
Closed: 7 years ago
status-firefox58:
--- → fixed
Resolution: --- → FIXED
Target Milestone: --- → mozilla58
You need to log in
before you can comment on or make changes to this bug.
Description
•