Bug 1312991 Get rid of nsIHTMLEditor::SetDocumentTitle() and mozilla::SetDocumentTitleTransaction r?smaug draft
authorMasayuki Nakano <masayuki@d-toybox.com>
Mon, 26 Dec 2016 17:46:23 +0900
changeset 453911 7d4efe769b54f35f41aa64429ef6a76aaecf3320
parent 453842 5ea0c495d3b2318287bffe1121e0e33d74427143
child 453912 7d826deb76e8e7c1c62d539c0d404902f9375f20
push id39762
push usermasayuki@d-toybox.com
push dateMon, 26 Dec 2016 10:38:02 +0000
reviewerssmaug
bugs1312991
milestone53.0a1
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
editor/libeditor/HTMLEditor.cpp
editor/libeditor/SetDocumentTitleTransaction.cpp
editor/libeditor/SetDocumentTitleTransaction.h
editor/libeditor/moz.build
editor/libeditor/tests/chrome.ini
editor/libeditor/tests/test_set_document_title_transaction.html
editor/nsIHTMLEditor.idl
--- 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();