Bug 1312991 Get rid of nsIHTMLEditor::SetDocumentTitle() and mozilla::SetDocumentTitleTransaction r?smaug
Now, nobody (including add-ons) uses nsIHTMLEditor::SetDocumentTitle(), so, we can remove it.
Additionally, mozilla::SetDocumentTitleTransaction is created only when nsIHMLEditor::SetDocumentTitle(), so, we can remove this class too.
MozReview-Commit-ID: HK7G9u7HUlh
--- a/editor/libeditor/HTMLEditor.cpp
+++ b/editor/libeditor/HTMLEditor.cpp
@@ -12,17 +12,16 @@
#include "nsCRT.h"
#include "nsUnicharUtils.h"
#include "HTMLEditorEventListener.h"
#include "HTMLEditRules.h"
#include "HTMLEditUtils.h"
#include "HTMLURIRefObject.h"
-#include "SetDocumentTitleTransaction.h"
#include "StyleSheetTransactions.h"
#include "TextEditUtils.h"
#include "TypeInState.h"
#include "nsIDOMText.h"
#include "nsIDOMMozNamedAttrMap.h"
#include "nsIDOMNodeList.h"
#include "nsIDOMDocument.h"
@@ -806,32 +805,16 @@ HTMLEditor::NodeIsBlock(nsIDOMNode* aNod
}
bool
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<SetDocumentTitleTransaction> 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.
*/
Element*
HTMLEditor::GetBlockNodeParent(nsINode* aNode)
{
MOZ_ASSERT(aNode);
deleted file mode 100644
--- 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<nsIEditor> editor = do_QueryInterface(mEditor);
- if (NS_WARN_IF(!editor)) {
- return NS_ERROR_FAILURE;
- }
-
- nsCOMPtr<nsIDOMDocument> domDoc;
- nsresult rv = editor->GetDocument(getter_AddRefs(domDoc));
- if (NS_WARN_IF(!domDoc)) {
- return NS_ERROR_FAILURE;
- }
-
- nsCOMPtr<nsIDOMNodeList> 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<nsIDOMNode> 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<nsIDOMNode> child;
- rv = titleNode->GetFirstChild(getter_AddRefs(child));
- if (NS_FAILED(rv)) {
- return rv;
- }
-
- if(child) {
- // Save current text as the undo value
- nsCOMPtr<nsIDOMCharacterData> 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 <HEAD> node, create a <TITLE> 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
deleted file mode 100644
--- 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
--- a/editor/libeditor/moz.build
+++ b/editor/libeditor/moz.build
@@ -59,17 +59,16 @@ UNIFIED_SOURCES += [
'HTMLTableEditor.cpp',
'HTMLURIRefObject.cpp',
'InsertNodeTransaction.cpp',
'InsertTextTransaction.cpp',
'InternetCiter.cpp',
'JoinNodeTransaction.cpp',
'PlaceholderTransaction.cpp',
'SelectionState.cpp',
- 'SetDocumentTitleTransaction.cpp',
'SplitNodeTransaction.cpp',
'StyleSheetTransactions.cpp',
'TextEditor.cpp',
'TextEditorDataTransfer.cpp',
'TextEditorTest.cpp',
'TextEditRules.cpp',
'TextEditRulesBidi.cpp',
'TextEditUtils.cpp',
--- a/editor/libeditor/tests/chrome.ini
+++ b/editor/libeditor/tests/chrome.ini
@@ -4,11 +4,10 @@ support-files = green.png
[test_bug489202.xul]
[test_bug599983.xul]
[test_bug607584.xul]
[test_bug616590.xul]
[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
deleted file mode 100644
--- a/editor/libeditor/tests/test_set_document_title_transaction.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>Test for SetDocumentTitleTransaction</title>
- <script type="text/javascript"
- src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
- <link rel="stylesheet" type="text/css"
- href="chrome://mochikit/content/tests/SimpleTest/test.css" />
-</head>
-<body onload="runTests()">
-<div id="display">
- <iframe src="data:text/html,<!DOCTYPE html><html><head><title>first title</title></head><body></body></html>"></iframe>
-</div>
-<div id="content" style="display: none">
-</div>
-<pre id="test">
-</pre>
-
-<script class="testbody" type="application/javascript">
-function runTests() {
- var iframe = document.getElementsByTagName("iframe")[0];
- function isDocumentTitleEquals(aDescription, aExpectedTitle) {
- is(iframe.contentDocument.title, aExpectedTitle, aDescription + ": document.title should be " + aExpectedTitle);
- is(iframe.contentDocument.getElementsByTagName("title")[0].textContent, aExpectedTitle, aDescription + ": The text in the title element should be " + aExpectedTitle);
- }
-
- isDocumentTitleEquals("Checking isDocumentTitleEquals()", "first title");
-
- const kTests = [
- { description: "designMode=\"on\"",
- init: function () {
- iframe.contentDocument.designMode = "on";
- },
- cleanUp: function () {
- iframe.contentDocument.designMode = "off";
- }
- },
- { description: "html element has contenteditable attribute",
- init: function () {
- iframe.contentDocument.documentElement.setAttribute("contenteditable", "true");
- },
- cleanUp: function () {
- iframe.contentDocument.documentElement.removeAttribute("contenteditable");
- }
- },
- ];
-
- for (var i = 0; i < kTests.length; i++) {
- const kTest = kTests[i];
- kTest.init();
-
- var editor = SpecialPowers.wrap(iframe.contentWindow).
- QueryInterface(SpecialPowers.Ci.nsIInterfaceRequestor).
- getInterface(SpecialPowers.Ci.nsIWebNavigation).
- QueryInterface(SpecialPowers.Ci.nsIDocShell).editor;
- ok(editor, kTest.description + ": The docshell should have editor");
- var htmlEditor = editor.QueryInterface(SpecialPowers.Ci.nsIHTMLEditor);
- ok(htmlEditor, kTest.description + ": The editor should have nsIHTMLEditor interface");
-
- // Replace existing title.
- htmlEditor.setDocumentTitle("Modified title");
- isDocumentTitleEquals(kTest.description, "Modified title");
-
- // When the document doesn't have <title> element, title element should be created automatically.
- iframe.contentDocument.head.removeChild(iframe.contentDocument.getElementsByTagName("title")[0]);
- is(iframe.contentDocument.getElementsByTagName("title").length, 0, kTest.description + ": There should be no title element");
- htmlEditor.setDocumentTitle("new title");
- is(iframe.contentDocument.getElementsByTagName("title").length, 1, kTest.description + ": There should be a title element");
- isDocumentTitleEquals(kTest.description, "new title");
-
- kTest.cleanUp();
- }
-
- SimpleTest.finish();
-}
-</script>
-</body>
-
-</html>
--- a/editor/nsIHTMLEditor.idl
+++ b/editor/nsIHTMLEditor.idl
@@ -232,21 +232,16 @@ interface nsIHTMLEditor : nsISupports
* If aDeleteSelection is PR_FALSE, then the element is inserted
* after the end of the selection for all element except
* Named Anchors, which insert before the selection
*/
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 <base> tag
* This should be done after the document URL has changed,
* such as after saving a file
* This is used as base for relativizing link and image urls
*/
void updateBaseURL();