diff --git a/content/html/content/src/nsGenericHTMLElement.cpp b/content/html/content/src/nsGenericHTMLElement.cpp
index d742bfc802a..bfb1268de59 100644
--- a/content/html/content/src/nsGenericHTMLElement.cpp
+++ b/content/html/content/src/nsGenericHTMLElement.cpp
@@ -109,7 +109,7 @@
#include "nsICSSOMFactory.h"
#include "prprf.h"
#include "prmem.h"
-#include "nsIFormControlFrame.h"
+#include "nsITextControlFrame.h"
#include "nsIForm.h"
#include "nsIFormControl.h"
#include "nsIDOMHTMLFormElement.h"
@@ -4128,3 +4128,23 @@ nsGenericHTMLElement::InternalGetExistingAttrNameFromQName(const nsAString& aStr
return mAttrsAndChildren.GetExistingAttrNameFromQName(
NS_ConvertUTF16toUTF8(aStr));
}
+
+nsresult
+nsGenericHTMLElement::GetEditor(nsIEditor** aEditor)
+{
+ *aEditor = nsnull;
+
+ if (!nsContentUtils::IsCallerChrome())
+ return NS_ERROR_DOM_SECURITY_ERR;
+
+ nsIFormControlFrame *fcFrame = GetFormControlFrame(PR_FALSE);
+ if (fcFrame) {
+ nsITextControlFrame *textFrame = nsnull;
+ CallQueryInterface(fcFrame, &textFrame);
+ if (textFrame) {
+ return textFrame->GetEditor(aEditor);
+ }
+ }
+
+ return NS_OK;
+}
diff --git a/content/html/content/src/nsGenericHTMLElement.h b/content/html/content/src/nsGenericHTMLElement.h
index 0afea67a580..c3fc7c506fd 100644
--- a/content/html/content/src/nsGenericHTMLElement.h
+++ b/content/html/content/src/nsGenericHTMLElement.h
@@ -62,6 +62,7 @@ class nsIForm;
class nsPresState;
class nsIScrollableView;
class nsILayoutHistoryState;
+class nsIEditor;
struct nsRect;
struct nsSize;
struct nsRuleData;
@@ -797,6 +798,11 @@ protected:
* are any.
*/
void RecreateFrames();
+
+ /**
+ * Locate an nsIEditor rooted at this content node, if there is one.
+ */
+ NS_HIDDEN_(nsresult) GetEditor(nsIEditor** aEditor);
};
diff --git a/content/html/content/src/nsHTMLInputElement.cpp b/content/html/content/src/nsHTMLInputElement.cpp
index 67da114406b..df2fb645382 100644
--- a/content/html/content/src/nsHTMLInputElement.cpp
+++ b/content/html/content/src/nsHTMLInputElement.cpp
@@ -163,6 +163,9 @@ public:
// nsIPhonetic
NS_DECL_NSIPHONETIC
+ // nsIDOMNSEditableElement
+ NS_FORWARD_NSIDOMNSEDITABLEELEMENT(nsGenericHTMLElement::)
+
// Overriden nsIFormControl methods
NS_IMETHOD_(PRInt32) GetType() const { return mType; }
NS_IMETHOD Reset();
@@ -375,6 +378,7 @@ NS_HTML_CONTENT_INTERFACE_MAP_BEGIN(nsHTMLInputElement,
NS_INTERFACE_MAP_ENTRY(nsIPhonetic)
NS_INTERFACE_MAP_ENTRY(imgIDecoderObserver)
NS_INTERFACE_MAP_ENTRY(nsIImageLoadingContent)
+ NS_INTERFACE_MAP_ENTRY(nsIDOMNSEditableElement)
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(HTMLInputElement)
NS_HTML_CONTENT_INTERFACE_MAP_END
diff --git a/content/html/content/src/nsHTMLTextAreaElement.cpp b/content/html/content/src/nsHTMLTextAreaElement.cpp
index a71a69005d5..6498e73ab8b 100644
--- a/content/html/content/src/nsHTMLTextAreaElement.cpp
+++ b/content/html/content/src/nsHTMLTextAreaElement.cpp
@@ -99,6 +99,9 @@ public:
// nsIDOMNSHTMLTextAreaElement
NS_DECL_NSIDOMNSHTMLTEXTAREAELEMENT
+ // nsIDOMNSEditableElement
+ NS_FORWARD_NSIDOMNSEDITABLEELEMENT(nsGenericHTMLElement::)
+
// nsIFormControl
NS_IMETHOD_(PRInt32) GetType() const { return NS_FORM_TEXTAREA; }
NS_IMETHOD Reset();
@@ -191,6 +194,7 @@ NS_HTML_CONTENT_INTERFACE_MAP_BEGIN(nsHTMLTextAreaElement,
NS_INTERFACE_MAP_ENTRY(nsIDOMHTMLTextAreaElement)
NS_INTERFACE_MAP_ENTRY(nsIDOMNSHTMLTextAreaElement)
NS_INTERFACE_MAP_ENTRY(nsITextControlElement)
+ NS_INTERFACE_MAP_ENTRY(nsIDOMNSEditableElement)
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(HTMLTextAreaElement)
NS_HTML_CONTENT_INTERFACE_MAP_END
diff --git a/dom/public/idl/core/Makefile.in b/dom/public/idl/core/Makefile.in
index 8f5235e7125..282bf5a4169 100644
--- a/dom/public/idl/core/Makefile.in
+++ b/dom/public/idl/core/Makefile.in
@@ -75,6 +75,7 @@ XPIDLSRCS = \
nsIDOMXMLDocument.idl \
nsIDOMUserDataHandler.idl \
nsIDOMDOMConfiguration.idl \
+ nsIDOMNSEditableElement.idl \
$(NULL)
include $(topsrcdir)/config/rules.mk
diff --git a/dom/public/idl/core/nsIDOMNSEditableElement.idl b/dom/public/idl/core/nsIDOMNSEditableElement.idl
new file mode 100644
index 00000000000..20cc2918da6
--- /dev/null
+++ b/dom/public/idl/core/nsIDOMNSEditableElement.idl
@@ -0,0 +1,52 @@
+/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Google Inc.
+ * Portions created by the Initial Developer are Copyright (C) 2005
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Brian Ryner
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "nsISupports.idl"
+
+interface nsIEditor;
+
+/**
+ * This interface is implemented by elements which have inner editable content,
+ * such as HTML input and textarea.
+*/
+
+[scriptable, uuid(c4a71f8e-82ba-49d7-94f9-beb359361072)]
+interface nsIDOMNSEditableElement : nsISupports
+{
+ readonly attribute nsIEditor editor;
+};
diff --git a/dom/public/idl/html/nsIDOMNSHTMLInputElement.idl b/dom/public/idl/html/nsIDOMNSHTMLInputElement.idl
index 9f123873071..750e80f7b85 100644
--- a/dom/public/idl/html/nsIDOMNSHTMLInputElement.idl
+++ b/dom/public/idl/html/nsIDOMNSHTMLInputElement.idl
@@ -37,13 +37,13 @@
*
* ***** END LICENSE BLOCK ***** */
-#include "domstubs.idl"
+#include "nsIDOMNSEditableElement.idl"
interface nsIControllers;
-[scriptable, uuid(993d2efc-a768-11d3-bccd-0060b0fc76bd)]
-interface nsIDOMNSHTMLInputElement : nsISupports
+[scriptable, uuid(5e050532-1d12-4b98-ba20-6c883dc0d954)]
+interface nsIDOMNSHTMLInputElement : nsIDOMNSEditableElement
{
readonly attribute nsIControllers controllers;
diff --git a/dom/public/idl/html/nsIDOMNSHTMLTextAreaElement.idl b/dom/public/idl/html/nsIDOMNSHTMLTextAreaElement.idl
index aee7118ed7b..aac54d70023 100644
--- a/dom/public/idl/html/nsIDOMNSHTMLTextAreaElement.idl
+++ b/dom/public/idl/html/nsIDOMNSHTMLTextAreaElement.idl
@@ -37,13 +37,13 @@
*
* ***** END LICENSE BLOCK ***** */
-#include "domstubs.idl"
+#include "nsIDOMNSEditableElement.idl"
interface nsIControllers;
-[scriptable, uuid(ca066b44-9ddf-11d3-bccc-0060b0fc76bd)]
-interface nsIDOMNSHTMLTextAreaElement : nsISupports
+[scriptable, uuid(8aa7dadc-73f1-416e-9d1e-15bc63226938)]
+interface nsIDOMNSHTMLTextAreaElement : nsIDOMNSEditableElement
{
readonly attribute nsIControllers controllers;