diff --git a/editor/libeditor/HTMLEditor.cpp b/editor/libeditor/HTMLEditor.cpp index 5dca4574fbea..a09841dade7a 100644 --- a/editor/libeditor/HTMLEditor.cpp +++ b/editor/libeditor/HTMLEditor.cpp @@ -17,7 +17,6 @@ #include "HTMLEditRules.h" #include "HTMLEditUtils.h" #include "HTMLURIRefObject.h" -#include "SetDocumentTitleTransaction.h" #include "StyleSheetTransactions.h" #include "TextEditUtils.h" #include "TypeInState.h" @@ -811,22 +810,6 @@ HTMLEditor::IsBlockNode(nsINode* aNode) return aNode && NodeIsBlockStatic(aNode); } -// Non-static version for the nsIEditor interface and JavaScript -NS_IMETHODIMP -HTMLEditor::SetDocumentTitle(const nsAString& aTitle) -{ - RefPtr transaction = - new SetDocumentTitleTransaction(); - NS_ENSURE_TRUE(transaction, NS_ERROR_OUT_OF_MEMORY); - - nsresult rv = transaction->Init(this, &aTitle); - NS_ENSURE_SUCCESS(rv, rv); - - //Don't let Rules System change the selection - AutoTransactionsConserveSelection dontChangeSelection(this); - return EditorBase::DoTransaction(transaction); -} - /** * GetBlockNodeParent returns enclosing block level ancestor, if any. */ diff --git a/editor/libeditor/SetDocumentTitleTransaction.cpp b/editor/libeditor/SetDocumentTitleTransaction.cpp deleted file mode 100644 index 2b3c8c97ff0f..000000000000 --- a/editor/libeditor/SetDocumentTitleTransaction.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "SetDocumentTitleTransaction.h" -#include "mozilla/dom/Element.h" // for Element -#include "nsAString.h" -#include "nsCOMPtr.h" // for nsCOMPtr, getter_AddRefs, etc. -#include "nsDebug.h" // for NS_ENSURE_SUCCESS, etc. -#include "nsError.h" // for NS_OK, NS_ERROR_FAILURE, etc. -#include "nsIDOMCharacterData.h" // for nsIDOMCharacterData -#include "nsIDOMDocument.h" // for nsIDOMDocument -#include "nsIDOMElement.h" // for nsIDOMElement -#include "nsIDOMNode.h" // for nsIDOMNode -#include "nsIDOMNodeList.h" // for nsIDOMNodeList -#include "nsIDOMText.h" // for nsIDOMText -#include "nsIDocument.h" // for nsIDocument -#include "nsIEditor.h" // for nsIEditor -#include "nsIHTMLEditor.h" // for nsIHTMLEditor -#include "nsLiteralString.h" // for NS_LITERAL_STRING -#include "nsTextNode.h" // for nsTextNode -#include "nsQueryObject.h" // for do_QueryObject - -namespace mozilla { - -// Note that aEditor is not refcounted. -SetDocumentTitleTransaction::SetDocumentTitleTransaction() - : mEditor(nullptr) - , mIsTransient(false) -{ -} - -NS_IMETHODIMP -SetDocumentTitleTransaction::Init(nsIHTMLEditor* aEditor, - const nsAString* aValue) - -{ - NS_ASSERTION(aEditor && aValue, "null args"); - if (!aEditor || !aValue) { - return NS_ERROR_NULL_POINTER; - } - - mEditor = aEditor; - mValue = *aValue; - - return NS_OK; -} - -NS_IMETHODIMP -SetDocumentTitleTransaction::DoTransaction() -{ - return SetDomTitle(mValue); -} - -NS_IMETHODIMP -SetDocumentTitleTransaction::UndoTransaction() -{ - // No extra work required; the DOM changes alone are enough - return NS_OK; -} - -NS_IMETHODIMP -SetDocumentTitleTransaction::RedoTransaction() -{ - // No extra work required; the DOM changes alone are enough - return NS_OK; -} - -nsresult -SetDocumentTitleTransaction::SetDomTitle(const nsAString& aTitle) -{ - nsCOMPtr editor = do_QueryInterface(mEditor); - if (NS_WARN_IF(!editor)) { - return NS_ERROR_FAILURE; - } - - nsCOMPtr domDoc; - nsresult rv = editor->GetDocument(getter_AddRefs(domDoc)); - if (NS_WARN_IF(!domDoc)) { - return NS_ERROR_FAILURE; - } - - nsCOMPtr titleList; - rv = domDoc->GetElementsByTagName(NS_LITERAL_STRING("title"), - getter_AddRefs(titleList)); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - // First assume we will NOT really do anything - // (transaction will not be pushed on stack) - mIsTransient = true; - - nsCOMPtr titleNode; - if(titleList) { - rv = titleList->Item(0, getter_AddRefs(titleNode)); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - if (titleNode) { - // Delete existing child textnode of title node - // (Note: all contents under a TITLE node are always in a single text node) - nsCOMPtr child; - rv = titleNode->GetFirstChild(getter_AddRefs(child)); - if (NS_FAILED(rv)) { - return rv; - } - - if(child) { - // Save current text as the undo value - nsCOMPtr textNode = do_QueryInterface(child); - if(textNode) { - textNode->GetData(mUndoValue); - - // If title text is identical to what already exists, - // quit now (mIsTransient is now TRUE) - if (mUndoValue == aTitle) { - return NS_OK; - } - } - rv = editor->DeleteNode(child); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - } - } - } - - // We didn't return above, thus we really will be changing the title - mIsTransient = false; - - // Get the node, create a and insert it under the HEAD - nsCOMPtr<nsIDocument> document = do_QueryInterface(domDoc); - if (NS_WARN_IF(!document)) { - return NS_ERROR_UNEXPECTED; - } - - RefPtr<dom::Element> headElement = document->GetHeadElement(); - if (NS_WARN_IF(!headElement)) { - return NS_ERROR_UNEXPECTED; - } - - bool newTitleNode = false; - uint32_t newTitleIndex = 0; - - if (!titleNode) { - // Didn't find one above: Create a new one - nsCOMPtr<nsIDOMElement>titleElement; - rv = domDoc->CreateElement(NS_LITERAL_STRING("title"), - getter_AddRefs(titleElement)); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - if (NS_WARN_IF(!titleElement)) { - return NS_ERROR_FAILURE; - } - - titleNode = do_QueryInterface(titleElement); - newTitleNode = true; - - // Get index so we append new title node after all existing HEAD children. - newTitleIndex = headElement->GetChildCount(); - } - - // Append a text node under the TITLE only if the title text isn't empty. - if (titleNode && !aTitle.IsEmpty()) { - RefPtr<nsTextNode> textNode = document->CreateTextNode(aTitle); - - if (newTitleNode) { - // Not undoable: We will insert newTitleNode below - nsCOMPtr<nsINode> title = do_QueryInterface(titleNode); - MOZ_ASSERT(title); - - ErrorResult result; - title->AppendChild(*textNode, result); - if (NS_WARN_IF(result.Failed())) { - return result.StealNSResult(); - } - } else { - // This is an undoable transaction - nsCOMPtr<nsIDOMNode> newNode = do_QueryObject(textNode); - if (NS_WARN_IF(!newNode)) { - return NS_ERROR_FAILURE; - } - - rv = editor->InsertNode(newNode, titleNode, 0); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - } - // Calling AppendChild() or InsertNode() could cause removing the head - // element. So, let's mark it dirty. - headElement = nullptr; - } - - if (newTitleNode) { - if (!headElement) { - headElement = document->GetHeadElement(); - if (NS_WARN_IF(!headElement)) { - // XXX Can we return NS_OK when there is no head element? - return NS_ERROR_UNEXPECTED; - } - } - // Undoable transaction to insert title+text together - rv = editor->InsertNode(titleNode, headElement->AsDOMNode(), newTitleIndex); - } - return rv; -} - -NS_IMETHODIMP -SetDocumentTitleTransaction::GetTxnDescription(nsAString& aString) -{ - aString.AssignLiteral("SetDocumentTitleTransaction: "); - aString += mValue; - return NS_OK; -} - -NS_IMETHODIMP -SetDocumentTitleTransaction::GetIsTransient(bool* aIsTransient) -{ - if (NS_WARN_IF(!aIsTransient)) { - return NS_ERROR_NULL_POINTER; - } - *aIsTransient = mIsTransient; - return NS_OK; -} - -} // namespace mozilla diff --git a/editor/libeditor/SetDocumentTitleTransaction.h b/editor/libeditor/SetDocumentTitleTransaction.h deleted file mode 100644 index 0f17fe8d2319..000000000000 --- a/editor/libeditor/SetDocumentTitleTransaction.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef SetDocumentTitleTransaction_h -#define SetDocumentTitleTransaction_h - -#include "mozilla/EditTransactionBase.h" // for EditTransactionBase, etc. -#include "nsString.h" // for nsString -#include "nscore.h" // for NS_IMETHOD, nsAString, etc. - -class nsIHTMLEditor; - -namespace mozilla { - -/** - * A transaction that changes the document's title, - * which is a text node under the <title> tag in a page's <head> section - * provides default concrete behavior for all nsITransaction methods. - */ -class SetDocumentTitleTransaction final : public EditTransactionBase -{ -public: - /** - * Initialize the transaction. - * @param aEditor The object providing core editing operations. - * @param aValue The new value for document title. - */ - NS_IMETHOD Init(nsIHTMLEditor* aEditor, - const nsAString* aValue); - SetDocumentTitleTransaction(); - -private: - nsresult SetDomTitle(const nsAString& aTitle); - -public: - NS_DECL_EDITTRANSACTIONBASE - - NS_IMETHOD RedoTransaction() override; - NS_IMETHOD GetIsTransient(bool *aIsTransient) override; - -protected: - - // The editor that created this transaction. - nsIHTMLEditor* mEditor; - - // The new title string. - nsString mValue; - - // The previous title string to use for undo. - nsString mUndoValue; - - // Set true if we dont' really change the title during Do(). - bool mIsTransient; -}; - -} // namespace mozilla - -#endif // #ifndef SetDocumentTitleTransaction_h diff --git a/editor/libeditor/moz.build b/editor/libeditor/moz.build index 998ef3d3937c..8e1bd6781e4d 100644 --- a/editor/libeditor/moz.build +++ b/editor/libeditor/moz.build @@ -64,7 +64,6 @@ UNIFIED_SOURCES += [ 'JoinNodeTransaction.cpp', 'PlaceholderTransaction.cpp', 'SelectionState.cpp', - 'SetDocumentTitleTransaction.cpp', 'SplitNodeTransaction.cpp', 'StyleSheetTransactions.cpp', 'TextEditor.cpp', diff --git a/editor/libeditor/tests/chrome.ini b/editor/libeditor/tests/chrome.ini index 98db30001427..20984d0c3f9f 100644 --- a/editor/libeditor/tests/chrome.ini +++ b/editor/libeditor/tests/chrome.ini @@ -9,6 +9,5 @@ support-files = green.png [test_bug780908.xul] [test_contenteditable_text_input_handling.html] [test_htmleditor_keyevent_handling.html] -[test_set_document_title_transaction.html] [test_texteditor_keyevent_handling.html] skip-if = (debug && os=='win') || (os == 'linux') # Bug 1116205, leaks on windows debug, fails delete key on linux diff --git a/editor/libeditor/tests/test_set_document_title_transaction.html b/editor/libeditor/tests/test_set_document_title_transaction.html deleted file mode 100644 index d745d4f135c0..000000000000 --- a/editor/libeditor/tests/test_set_document_title_transaction.html +++ /dev/null @@ -1,79 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <title>Test for SetDocumentTitleTransaction - - - - -
- -
- -
-
- - - - - diff --git a/editor/nsIHTMLEditor.idl b/editor/nsIHTMLEditor.idl index 59f90961a919..3d2af68c82cb 100644 --- a/editor/nsIHTMLEditor.idl +++ b/editor/nsIHTMLEditor.idl @@ -236,11 +236,6 @@ interface nsIHTMLEditor : nsISupports void insertElementAtSelection(in nsIDOMElement aElement, in boolean aDeleteSelection); - /** - * Set the documents title. - */ - void setDocumentTitle(in AString aTitle); - /** * Set the BaseURL for the document to the current URL * but only if the page doesn't have a tag