54726: Add link to W3C Validator

90550: Need to rewrite URLs for publishing and for save as
91388: Link checker, Work in progress (doesn't work yet)
r=brade, sr=kin
This commit is contained in:
akkana%netscape.com 2001-08-07 21:39:07 +00:00
Родитель 4cfc6eee87
Коммит ced498ab2c
15 изменённых файлов: 350 добавлений и 487 удалений

Просмотреть файл

@ -138,6 +138,7 @@
#include "nsWidgetsCID.h"
#include "nsIClipboard.h"
#include "nsITransferable.h"
#include "nsISupportsArray.h"
/* Define Class IDs */
@ -4434,28 +4435,32 @@ nsEditorShell::GetSelectedCellsType(nsIDOMElement *aElement, PRUint32 *_retval)
/* end of table editing */
NS_IMETHODIMP
nsEditorShell::GetLinkedObjects(nsISupportsArray **aObjectArray)
{
if (!aObjectArray)
return NS_ERROR_NULL_POINTER;
if (mEditorType == eHTMLTextEditorType)
return mEditor->GetLinkedObjects(aObjectArray);
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsEditorShell::GetEmbeddedObjects(nsISupportsArray **aObjectArray)
{
if (!aObjectArray)
return NS_ERROR_NULL_POINTER;
nsresult result = NS_NOINTERFACE;
switch (mEditorType)
if (mEditorType == eHTMLTextEditorType)
{
case eHTMLTextEditorType:
{
nsCOMPtr<nsIEditorMailSupport> mailEditor = do_QueryInterface(mEditor);
if (mailEditor)
result = mailEditor->GetEmbeddedObjects(aObjectArray);
}
break;
default:
result = NS_NOINTERFACE;
nsCOMPtr<nsIEditorMailSupport> mailEditor = do_QueryInterface(mEditor);
if (mailEditor)
return mailEditor->GetEmbeddedObjects(aObjectArray);
}
return result;
return NS_NOINTERFACE;
}
NS_IMETHODIMP
@ -5054,8 +5059,6 @@ nsEditorShell::OnStateChange(nsIWebProgress *aProgress,
PRInt32 aStateFlags,
nsresult aStatus)
{
nsresult rv = NS_OK;
//
// A Request has started...
//

Просмотреть файл

@ -31,6 +31,8 @@
#include "nsEditorEventListeners.h"
#include "TypeInState.h"
#include "nsHTMLURIRefObject.h"
#include "nsIDOMText.h"
#include "nsIDOMNodeList.h"
#include "nsIDOMDocument.h"
@ -44,7 +46,6 @@
#include "nsISelection.h"
#include "nsISelectionPrivate.h"
#include "nsIDOMHTMLAnchorElement.h"
#include "nsIDOMHTMLImageElement.h"
#include "nsISelectionController.h"
#include "TransactionFactory.h"
@ -3048,6 +3049,68 @@ NS_IMETHODIMP nsHTMLEditor::SetBodyAttribute(const nsAReadableString& aAttribute
return res;
}
NS_IMETHODIMP
nsHTMLEditor::GetLinkedObjects(nsISupportsArray** aNodeList)
{
if (!aNodeList)
return NS_ERROR_NULL_POINTER;
nsresult res;
res = NS_NewISupportsArray(aNodeList);
if (NS_FAILED(res)) return res;
if (!*aNodeList) return NS_ERROR_NULL_POINTER;
nsCOMPtr<nsIContentIterator> iter;
res = nsComponentManager::CreateInstance(kCContentIteratorCID, nsnull,
NS_GET_IID(nsIContentIterator),
getter_AddRefs(iter));
if (!iter) return NS_ERROR_NULL_POINTER;
if ((NS_SUCCEEDED(res)))
{
// get the root content
nsCOMPtr<nsIContent> rootContent;
nsCOMPtr<nsIDOMDocument> domdoc;
nsEditor::GetDocument(getter_AddRefs(domdoc));
if (!domdoc)
return NS_ERROR_UNEXPECTED;
nsCOMPtr<nsIDocument> doc (do_QueryInterface(domdoc));
if (!doc)
return NS_ERROR_UNEXPECTED;
doc->GetRootContent(getter_AddRefs(rootContent));
iter->Init(rootContent);
// loop through the content iterator for each content node
while (NS_ENUMERATOR_FALSE == iter->IsDone())
{
nsCOMPtr<nsIContent> content;
res = iter->CurrentNode(getter_AddRefs(content));
if (NS_FAILED(res))
break;
nsCOMPtr<nsIDOMNode> node (do_QueryInterface(content));
if (node)
{
// Let nsURIRefObject make the hard decisions:
nsCOMPtr<nsIURIRefObject> refObject;
res = NS_NewHTMLURIRefObject(getter_AddRefs(refObject), node);
if (NS_SUCCEEDED(res))
{
nsCOMPtr<nsISupports> isupp (do_QueryInterface(refObject));
if (isupp)
(*aNodeList)->AppendElement(isupp);
}
}
iter->Next();
}
}
return NS_OK;
}
#ifdef XP_MAC
#pragma mark -
#pragma mark nsIEditorStyleSheets methods
@ -3278,7 +3341,7 @@ nsHTMLEditor::GetEmbeddedObjects(nsISupportsArray** aNodeList)
(*aNodeList)->AppendElement(node);
else if (tagName.EqualsWithConversion("a"))
{
// XXX Only include links if they're links to file: URLs
// Only include links if they're links to file: URLs
nsCOMPtr<nsIDOMHTMLAnchorElement> anchor (do_QueryInterface(content));
if (anchor)
{

Просмотреть файл

@ -156,6 +156,8 @@ public:
NS_IMETHOD InsertLinkAroundSelection(nsIDOMElement* aAnchorElement);
NS_IMETHOD GetLinkedObjects(nsISupportsArray** aNodeList);
/* ------------ nsIEditorIMESupport overrides -------------- */
NS_IMETHOD SetCompositionString(const nsAReadableString& aCompositionString, nsIPrivateTextRangeList* aTextRangeList,nsTextEventReply* aReply);
@ -186,7 +188,6 @@ public:
nsIDOMNode **aNodeInserted);
NS_IMETHOD GetEmbeddedObjects(nsISupportsArray** aNodeList);
/* ------------ nsITableEditor methods -------------- */
NS_IMETHOD InsertTableCell(PRInt32 aNumber, PRBool aAfter);

Просмотреть файл

@ -138,6 +138,7 @@
#include "nsWidgetsCID.h"
#include "nsIClipboard.h"
#include "nsITransferable.h"
#include "nsISupportsArray.h"
/* Define Class IDs */
@ -4434,28 +4435,32 @@ nsEditorShell::GetSelectedCellsType(nsIDOMElement *aElement, PRUint32 *_retval)
/* end of table editing */
NS_IMETHODIMP
nsEditorShell::GetLinkedObjects(nsISupportsArray **aObjectArray)
{
if (!aObjectArray)
return NS_ERROR_NULL_POINTER;
if (mEditorType == eHTMLTextEditorType)
return mEditor->GetLinkedObjects(aObjectArray);
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsEditorShell::GetEmbeddedObjects(nsISupportsArray **aObjectArray)
{
if (!aObjectArray)
return NS_ERROR_NULL_POINTER;
nsresult result = NS_NOINTERFACE;
switch (mEditorType)
if (mEditorType == eHTMLTextEditorType)
{
case eHTMLTextEditorType:
{
nsCOMPtr<nsIEditorMailSupport> mailEditor = do_QueryInterface(mEditor);
if (mailEditor)
result = mailEditor->GetEmbeddedObjects(aObjectArray);
}
break;
default:
result = NS_NOINTERFACE;
nsCOMPtr<nsIEditorMailSupport> mailEditor = do_QueryInterface(mEditor);
if (mailEditor)
return mailEditor->GetEmbeddedObjects(aObjectArray);
}
return result;
return NS_NOINTERFACE;
}
NS_IMETHODIMP
@ -5054,8 +5059,6 @@ nsEditorShell::OnStateChange(nsIWebProgress *aProgress,
PRInt32 aStateFlags,
nsresult aStatus)
{
nsresult rv = NS_OK;
//
// A Request has started...
//

Просмотреть файл

@ -23,7 +23,6 @@
#include "nsISupports.idl"
interface nsIFile;
interface nsISupportsArray;
interface nsIDocumentStateListener;
interface nsISelectionController;
interface nsITransactionManager;
@ -33,6 +32,7 @@ interface nsISelection;
interface nsIDOMElement;
interface nsIDOMNode;
interface nsIEditor;
interface nsISupportsArray;
[scriptable, uuid(9afff72b-ca9a-11d2-96c9-0060b0fb9956)]
interface nsIEditorShell : nsISupports
@ -501,6 +501,9 @@ interface nsIEditorShell : nsISupports
/* Get list of embedded objects, e.g. for mail compose */
nsISupportsArray GetEmbeddedObjects();
/* Get list of objects which refer to external URIs */
nsISupportsArray GetLinkedObjects();
/* Formatting */
void SetAttribute(in nsIDOMElement element, in wstring attr, in wstring value);
void RemoveAttribute(in nsIDOMElement element, in wstring attr);

Просмотреть файл

@ -26,6 +26,7 @@
#include "domstubs.idl"
#include "nsIAtom.idl"
interface nsISupportsArray;
%{C++
#define NS_EDITOR_ELEMENT_NOT_FOUND \
@ -405,5 +406,13 @@ interface nsIHTMLEditor : nsISupports
// Don't use this method! It will go away after first release!
void IgnoreSpuriousDragEvent(in boolean aIgnoreSpuriousDragEvent);
/**
* Find all the nodes in the document which contain references
* to outside URIs (e.g. a href, img src, script src, etc.)
* The objects in the array will be type nsIURIRefObject.
*
* @return aNodeList the linked nodes found
*/
nsISupportsArray GetLinkedObjects();
};

Просмотреть файл

@ -31,6 +31,8 @@
#include "nsEditorEventListeners.h"
#include "TypeInState.h"
#include "nsHTMLURIRefObject.h"
#include "nsIDOMText.h"
#include "nsIDOMNodeList.h"
#include "nsIDOMDocument.h"
@ -44,7 +46,6 @@
#include "nsISelection.h"
#include "nsISelectionPrivate.h"
#include "nsIDOMHTMLAnchorElement.h"
#include "nsIDOMHTMLImageElement.h"
#include "nsISelectionController.h"
#include "TransactionFactory.h"
@ -3048,6 +3049,68 @@ NS_IMETHODIMP nsHTMLEditor::SetBodyAttribute(const nsAReadableString& aAttribute
return res;
}
NS_IMETHODIMP
nsHTMLEditor::GetLinkedObjects(nsISupportsArray** aNodeList)
{
if (!aNodeList)
return NS_ERROR_NULL_POINTER;
nsresult res;
res = NS_NewISupportsArray(aNodeList);
if (NS_FAILED(res)) return res;
if (!*aNodeList) return NS_ERROR_NULL_POINTER;
nsCOMPtr<nsIContentIterator> iter;
res = nsComponentManager::CreateInstance(kCContentIteratorCID, nsnull,
NS_GET_IID(nsIContentIterator),
getter_AddRefs(iter));
if (!iter) return NS_ERROR_NULL_POINTER;
if ((NS_SUCCEEDED(res)))
{
// get the root content
nsCOMPtr<nsIContent> rootContent;
nsCOMPtr<nsIDOMDocument> domdoc;
nsEditor::GetDocument(getter_AddRefs(domdoc));
if (!domdoc)
return NS_ERROR_UNEXPECTED;
nsCOMPtr<nsIDocument> doc (do_QueryInterface(domdoc));
if (!doc)
return NS_ERROR_UNEXPECTED;
doc->GetRootContent(getter_AddRefs(rootContent));
iter->Init(rootContent);
// loop through the content iterator for each content node
while (NS_ENUMERATOR_FALSE == iter->IsDone())
{
nsCOMPtr<nsIContent> content;
res = iter->CurrentNode(getter_AddRefs(content));
if (NS_FAILED(res))
break;
nsCOMPtr<nsIDOMNode> node (do_QueryInterface(content));
if (node)
{
// Let nsURIRefObject make the hard decisions:
nsCOMPtr<nsIURIRefObject> refObject;
res = NS_NewHTMLURIRefObject(getter_AddRefs(refObject), node);
if (NS_SUCCEEDED(res))
{
nsCOMPtr<nsISupports> isupp (do_QueryInterface(refObject));
if (isupp)
(*aNodeList)->AppendElement(isupp);
}
}
iter->Next();
}
}
return NS_OK;
}
#ifdef XP_MAC
#pragma mark -
#pragma mark nsIEditorStyleSheets methods
@ -3278,7 +3341,7 @@ nsHTMLEditor::GetEmbeddedObjects(nsISupportsArray** aNodeList)
(*aNodeList)->AppendElement(node);
else if (tagName.EqualsWithConversion("a"))
{
// XXX Only include links if they're links to file: URLs
// Only include links if they're links to file: URLs
nsCOMPtr<nsIDOMHTMLAnchorElement> anchor (do_QueryInterface(content));
if (anchor)
{

Просмотреть файл

@ -156,6 +156,8 @@ public:
NS_IMETHOD InsertLinkAroundSelection(nsIDOMElement* aAnchorElement);
NS_IMETHOD GetLinkedObjects(nsISupportsArray** aNodeList);
/* ------------ nsIEditorIMESupport overrides -------------- */
NS_IMETHOD SetCompositionString(const nsAReadableString& aCompositionString, nsIPrivateTextRangeList* aTextRangeList,nsTextEventReply* aReply);
@ -186,7 +188,6 @@ public:
nsIDOMNode **aNodeInserted);
NS_IMETHOD GetEmbeddedObjects(nsISupportsArray** aNodeList);
/* ------------ nsITableEditor methods -------------- */
NS_IMETHOD InsertTableCell(PRInt32 aNumber, PRBool aAfter);

Просмотреть файл

@ -29,7 +29,6 @@
0xfdf23301, 0x4a94, 0x11d3, \
{ 0x9c, 0xe4, 0x99, 0x60, 0x49, 0x6c, 0x41, 0xbc } }
class nsString;
class nsISupportsArray;
class nsIDOMNode;

Просмотреть файл

@ -1,396 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape 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/NPL/
*
* 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 Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
#ifndef nsIHTMLEditor_h__
#define nsIHTMLEditor_h__
#define NS_IHTMLEDITOR_IID \
{ /* 4805e683-49b9-11d3-9ce4-ed60bd6cb5bc} */ \
0x4805e683, 0x49b9, 0x11d3, \
{ 0x9c, 0xe4, 0xed, 0x60, 0xbd, 0x6c, 0xb5, 0xbc } }
#define NS_EDITOR_ELEMENT_NOT_FOUND \
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_EDITOR, 1)
class nsString;
class nsStringArray;
class nsIAtom;
class nsIDOMNode;
class nsIDOMElement;
class nsIHTMLEditor : public nsISupports
{
public:
static const nsIID& GetIID() { static nsIID iid = NS_IHTMLEDITOR_IID; return iid; }
// used by GetAlignment()
typedef enum {
eLeft,
eCenter,
eRight,
eJustify
} EAlignment;
/* ------------ Inline property methods -------------- */
/**
* SetInlineProperty() sets the aggregate properties on the current selection
*
* @param aProperty the property to set on the selection
* @param aAttribute the attribute of the property, if applicable. May be null.
* Example: aProperty="font", aAttribute="color"
* @param aValue if aAttribute is not null, the value of the attribute. May be null.
* Example: aProperty="font", aAttribute="color", aValue="0x00FFFF"
*/
NS_IMETHOD SetInlineProperty(nsIAtom *aProperty,
const nsString *aAttribute,
const nsString *aValue)=0;
/**
* GetInlineProperty() gets the aggregate properties of the current selection.
* All object in the current selection are scanned and their attributes are
* represented in a list of Property object.
*
* @param aProperty the property to get on the selection
* @param aAttribute the attribute of the property, if applicable. May be null.
* Example: aProperty="font", aAttribute="color"
* @param aValue if aAttribute is not null, the value of the attribute. May be null.
* Example: aProperty="font", aAttribute="color", aValue="0x00FFFF"
* @param aFirst [OUT] PR_TRUE if the first text node in the selection has the property
* @param aAny [OUT] PR_TRUE if any of the text nodes in the selection have the property
* @param aAll [OUT] PR_TRUE if all of the text nodes in the selection have the property
*/
NS_IMETHOD GetInlineProperty(nsIAtom *aProperty,
const nsString *aAttribute,
const nsString *aValue,
PRBool &aFirst, PRBool &aAny, PRBool &aAll)=0;
NS_IMETHOD GetInlinePropertyWithAttrValue(nsIAtom *aProperty,
const nsString *aAttribute,
const nsString *aValue,
PRBool &aFirst, PRBool &aAny, PRBool &aAll,
nsString *outValue)=0;
/**
* RemoveAllInlineProperties() deletes all the inline properties from all
* text in the current selection.
*/
NS_IMETHOD RemoveAllInlineProperties()=0;
/**
* RemoveInlineProperty() deletes the properties from all text in the current selection.
* If aProperty is not set on the selection, nothing is done.
*
* @param aProperty the property to remove from the selection
* All atoms are for normal HTML tags (e.g.: nsIEditorProptery::font)
* except when you want to remove just links and not named anchors
* For that, use nsIEditorProperty::href
* @param aAttribute the attribute of the property, if applicable. May be null.
* Example: aProperty=nsIEditorProptery::font, aAttribute="color"
* nsIEditProperty::allAttributes is special. It indicates that
* all content-based text properties are to be removed from the selection.
*/
NS_IMETHOD RemoveInlineProperty(nsIAtom *aProperty, const nsString *aAttribute)=0;
/**
* Increase font size for text in selection by 1 HTML unit
* All existing text is scanned for existing <FONT SIZE> attributes
* so they will be incremented instead of inserting new <FONT> tag
*/
NS_IMETHOD IncreaseFontSize()=0;
/**
* Decrease font size for text in selection by 1 HTML unit
* All existing text is scanned for existing <FONT SIZE> attributes
* so they will be decreased instead of inserting new <FONT> tag
*/
NS_IMETHOD DecreaseFontSize()=0;
/* ------------ HTML content methods -------------- */
/**
* Tests if a node is a BLOCK element according the the HTML 4.0 DTD
* This does NOT consider CSS effect on display type
*
* @param aNode the node to test
*/
NS_IMETHOD NodeIsBlock(nsIDOMNode *aNode, PRBool &aIsBlock)=0;
/**
* Insert some HTML source at the current location
*
* @param aInputString the string to be inserted
*/
NS_IMETHOD InsertHTML(const nsString &aInputString)=0;
/** Rebuild the entire document from source HTML
* Needed to be able to edit HEAD and other outside-of-BODY content
*
* @param aSourceString HTML source string of the entire new document
*/
NS_IMETHOD RebuildDocumentFromSource(const nsString& aSourceString)=0;
/**
* Insert some HTML source, interpreting
* the string argument according to the given charset.
*
* @param aInputString the string to be inserted
* @param aCharset Charset of string
* @param aParentNode Parent to insert under.
* If null, insert at the current location.
*/
NS_IMETHOD InsertHTMLWithCharset(const nsString &aInputString,
const nsString& aCharset)=0;
/** Insert an element, which may have child nodes, at the selection
* Used primarily to insert a new element for various insert element dialogs,
* but it enforces the HTML 4.0 DTD "CanContain" rules, so it should
* be useful for other elements.
*
* @param aElement The element to insert
* @param aDeleteSelection Delete the selection before inserting
* 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
*/
NS_IMETHOD InsertElementAtSelection(nsIDOMElement* aElement, PRBool aDeleteSelection)=0;
/** Set the documents title.
*/
NS_IMETHOD SetDocumentTitle(const PRUnichar *aTitle)=0;
/* ------------ Selection manipulation -------------- */
/* Should these be moved to nsISelection? */
/** Set the selection at the suppled element
*
* @param aElement An element in the document
*/
NS_IMETHOD SelectElement(nsIDOMElement* aElement)=0;
/** Create a collapsed selection just after aElement
*
* XXX could we parameterize SelectElement(before/select/after>?
*
* The selection is set to parent-of-aElement with an
* offset 1 greater than aElement's offset
* but it enforces the HTML 4.0 DTD "CanContain" rules, so it should
* be useful for other elements.
*
* @param aElement An element in the document
*/
NS_IMETHOD SetCaretAfterElement(nsIDOMElement* aElement)=0;
/**
* SetParagraphFormat Insert a block paragraph tag around selection
* @param aParagraphFormat "p", "h1" to "h6", "address", "pre", or "blockquote"
*/
NS_IMETHOD SetParagraphFormat(const nsString& aParagraphFormat)=0;
/**
* GetParagraphState returns what block tag paragraph format is in the selection.
* @param aMixed True if there is more than one format
* @param outState Name of block tag. "" is returned for none.
*/
NS_IMETHOD GetParagraphState(PRBool &aMixed, nsString &outState)=0;
/**
* GetFontFaceState returns what font face is in the selection.
* @param aMixed True if there is more than one font face
* @param outFace Name of face. Note: "tt" is returned for
* tt tag. "" is returned for none.
*/
NS_IMETHOD GetFontFaceState(PRBool &aMixed, nsString &outFont)=0;
/**
* GetFontColorState returns what font face is in the selection.
* @param aMixed True if there is more than one font color
* @param outColor Color string. "" is returned for none.
*/
NS_IMETHOD GetFontColorState(PRBool &aMixed, nsString &outColor)=0;
/**
* GetFontColorState returns what font face is in the selection.
* @param aMixed True if there is more than one font color
* @param outColor Color string. "" is returned for none.
*/
NS_IMETHOD GetBackgroundColorState(PRBool &aMixed, nsString &outColor)=0;
/**
* GetListState returns what list type is in the selection.
* @param aMixed True if there is more than one type of list, or
* if there is some list and non-list
* @param aOL The company that employs me. No, really, it's
* true if an "ol" list is selected.
* @param aUL true if an "ul" list is selected.
* @param aDL true if a "dl" list is selected.
*/
NS_IMETHOD GetListState(PRBool &aMixed, PRBool &aOL, PRBool &aUL, PRBool &aDL)=0;
/**
* GetListItemState returns what list item type is in the selection.
* @param aMixed True if there is more than one type of list item, or
* if there is some list and non-list
* @param aLI true if "li" list items are selected.
* @param aDT true if "dt" list items are selected.
* @param aDD true if "dd" list items are selected.
*/
NS_IMETHOD GetListItemState(PRBool &aMixed, PRBool &aLI, PRBool &aDT, PRBool &aDD)=0;
/**
* GetAlignment returns what alignment is in the selection.
* @param aMixed True if there is more than one type of list item, or
* if there is some list and non-list
* @param aAlign enum value for first encountered alignment (left/center/right)
*/
NS_IMETHOD GetAlignment(PRBool &aMixed, EAlignment &aAlign)=0;
/**
* Document me!
*
*/
NS_IMETHOD GetIndentState(PRBool &aCanIndent, PRBool &aCanOutdent)=0;
/**
* Document me!
*
*/
NS_IMETHOD MakeOrChangeList(const nsString& aListType, PRBool entireList)=0;
/**
* Document me!
*
*/
NS_IMETHOD RemoveList(const nsString& aListType)=0;
/**
* Document me!
*
*/
NS_IMETHOD Indent(const nsString& aIndent)=0;
/**
* Document me!
*
*/
NS_IMETHOD Align(const nsString& aAlign)=0;
/** Return the input node or a parent matching the given aTagName,
* starting the search at the supplied node.
* An example of use is for testing if a node is in a table cell
* given a selection anchor node.
*
* @param aTagName The HTML tagname
* Special input values:
* Use "href" to get a link node
* (an "A" tag with the "href" attribute set)
* Use "anchor" or "namedanchor" to get a named anchor node
* (an "A" tag with the "name" attribute set)
* Use "list" to get an OL, UL, or DL list node
* Use "td" to get either a TD or TH cell node
*
* @param aNode The node in the document to start the search
* If it is null, the anchor node of the current selection is used
* Returns NS_EDITOR_ELEMENT_NOT_FOUND if an element is not found (passes NS_SUCCEEDED macro)
*/
NS_IMETHOD GetElementOrParentByTagName(const nsAReadableString& aTagName, nsIDOMNode *aNode, nsIDOMElement** aReturn)=0;
/** Return an element only if it is the only node selected,
* such as an image, horizontal rule, etc.
* The exception is a link, which is more like a text attribute:
* The Anchor tag is returned if the selection is within the textnode(s)
* that are children of the "A" node.
* This could be a collapsed selection, i.e., a caret within the link text.
*
* @param aTagName The HTML tagname or and empty string
* to get any element (but only if it is the only element selected)
* Special input values for Links and Named anchors:
* Use "href" to get a link node
* (an "A" tag with the "href" attribute set)
* Use "anchor" or "namedanchor" to get a named anchor node
* (an "A" tag with the "name" attribute set)
* Returns NS_EDITOR_ELEMENT_NOT_FOUND if an element is not found (passes NS_SUCCEEDED macro)
*/
NS_IMETHOD GetSelectedElement(const nsString& aTagName, nsIDOMElement** aReturn)=0;
/** Output the contents of the <HEAD> section as text/HTML format
*/
NS_IMETHOD GetHeadContentsAsHTML(nsString& aOutputString)=0;
/** Replace all children of <HEAD> with string of HTML source
*/
NS_IMETHOD ReplaceHeadContentsWithHTML(const nsString &aSourceToInsert)=0;
/** Return a new element with default attribute values
*
* This does not rely on the selection, and is not sensitive to context.
*
* Used primarily to supply new element for various insert element dialogs
* (Image, Link, NamedAnchor, Table, and HorizontalRule
* are the only returned elements as of 7/25/99)
*
* @param aTagName The HTML tagname
* Special input values for Links and Named anchors:
* Use "href" to get a link node
* (an "A" tag with the "href" attribute set)
* Use "anchor" or "namedanchor" to get a named anchor node
* (an "A" tag with the "name" attribute set)
*/
NS_IMETHOD CreateElementWithDefaults(const nsAReadableString& aTagName, nsIDOMElement** aReturn)=0;
/** Insert an link element as the parent of the current selection
*
* @param aElement An "A" element with a non-empty "href" attribute
*/
NS_IMETHOD InsertLinkAroundSelection(nsIDOMElement* aAnchorElement)=0;
/** Set the value of the "bgcolor" attribute on the document's <body> element
*
* @param aColor The HTML color string, such as "#ffccff" or "yellow"
*/
NS_IMETHOD SetBackgroundColor(const nsString& aColor)=0;
/** Set an attribute on the document's <body> element
* such as text, link, background colors
*
* 8/31/00 THIS ISN'T BEING USED? SHOULD WE DROP IT?
*
* @param aAttr The attribute to be set
* @param aValue The value of the attribute
*/
NS_IMETHOD SetBodyAttribute(const nsString& aAttr, const nsString& aValue)=0;
//XXX Used to suppress spurious drag/drop events to workaround bug 50703
// Don't use this method! It will go away after first release!
NS_IMETHOD IgnoreSpuriousDragEvent(PRBool aIgnoreSpuriousDragEvent)=0;
};
#endif // nsIHTMLEditor_h__

Просмотреть файл

@ -96,6 +96,8 @@ function SetupTextEditorCommands()
controller.registerCommand("cmd_find", nsFindCommand);
controller.registerCommand("cmd_findNext", nsFindNextCommand);
controller.registerCommand("cmd_spelling", nsSpellingCommand);
controller.registerCommand("cmd_validate", nsValidateCommand);
controller.registerCommand("cmd_checkLinks", nsCheckLinksCommand);
controller.registerCommand("cmd_insertChars", nsInsertCharsCommand);
}
@ -618,6 +620,157 @@ var nsSpellingCommand =
}
};
// Validate using http://validator.w3.org/file-upload.html
var URL2Validate;
var nsValidateCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell != null);
},
doCommand: function(aCommand)
{
// If the document hasn't been modified,
// then just validate the current url.
if (editorShell.documentModified || gHTMLSourceChanged)
{
if (!CheckAndSaveDocument(window.editorShell.GetString("BeforeValidate"),
false))
return;
// Check if we saved again just in case?
if (!DocumentHasBeenSaved()) // user hit cancel?
return;
}
URL2Validate = window.editorShell.editorDocument.location;
// XXX This should use SchemeIs instead of comparing against file:
if (URL2Validate.toString().indexOf("file://") >= 0)
{
URL2Validate = window.editorShell.editorDocument.location.pathname;
var vwin = window.open("http://validator.w3.org/file-upload.html",
"EditorValidate");
// Window loads asynchronously, so pass control to the load listener:
vwin.addEventListener("load", this.validateFilePageLoaded, false);
}
else
{
var vwin = window.open("http://validator.w3.org/",
"EditorValidate");
// Window loads asynchronously, so pass control to the load listener:
vwin.addEventListener("load", this.validateWebPageLoaded, false);
}
},
validateFilePageLoaded: function(event)
{
event.target.forms[0].uploaded_file.value = URL2Validate;
},
validateWebPageLoaded: function(event)
{
event.target.forms[0].uri.value = URL2Validate;
}
};
// Link checking.
// XXX THIS CODE IS WORK IN PROGRESS (only exposed in the debug menu).
const kIOSERVICE_CONTRACTID = "@mozilla.org/network/io-service;1";
const nsIIOService = Components.interfaces['nsIIOService'];
var nsLinkChecker =
{
uri : null,
linkCheckDone : true,
ios : Components.classes[kIOSERVICE_CONTRACTID].getService(nsIIOService),
linkCheckURI : "",
LoadFromURI: function(aURI, ioService) {
this.done = false;
this.uri = aURI;
dump("LoadFromURI(" + this.uri + ")\n");
var theURI = this.ios.newURI(this.uri, null);
//pacURL = uri.spec;
var channel = this.ios.newChannelFromURI(theURI);
// Don't load for cache, that would be cheating:
//channel.loadFlags |= nsIRequest::LOAD_BYPASS_CACHE;
try {
var httpChannel = channel.QueryInterface(Components.interfaces.nsIHttpChannel);
if (httpChannel) {
httpChannel.requestMethod = "HEAD";
}
} catch(e) { }
try {
channel.asyncOpen(this, null);
}
catch (ex) {
dump("asyncOpen failed for " + this.uri + "\n");
}
},
// nsIStreamListener interface
onStartRequest: function(request, ctxt) {
dump("onStartRequest(" + this.uri + ", status = " + request.status
+ ")\n");
try {
var httpChannel = request.QueryInterface(Components.interfaces.nsIHttpChannel);
if (httpChannel) {
var stat = httpChannel.responseStatus/100;
dump("Response status was " + stat + "\n");
}
} catch(e) { }
// Probably don't actually need this stream if we're not going to read:
this.sis =
Components.Constructor('@mozilla.org/scriptableinputstream;1',
'nsIScriptableInputStream',
'init');
throw(Components.results.NS_ERROR_FAILURE);
},
onStopRequest: function(request, ctxt, status, errorMsg) {
dump("onStopRequest(" + this.uri + ", status = " + status + ")\n");
this.done = true;
},
onDataAvailable: function(request, ctxt, inStream, sourceOffset, count) {
dump("onDataAvailable(" + this.uri + ")\n");
var ins = new this.sis(inStream);
pac += ins.read(count);
// Now check the error code and cancel the request.
// This should pass NS_BINDING_ABORTED, according to nsIRequest.idl,
// but it doesn't seem to be available from JS.
// ((nsresult) (((PRUint32)(NS_ERROR_SEVERITY_ERROR)<<31) | ((PRUint32)(module+
// NS_ERROR_MODULE_BASE_OFFSET)<<16) | ((PRUint32)(code))
//request.cancel(0x80000001);
}
};
var nsCheckLinksCommand =
{
isCommandEnabled: function(aCommand, dummy)
{
return (window.editorShell != null);
},
doCommand: function(aCommand)
{
objects = window.editorShell.GetLinkedObjects();
// Objects is an nsISupportsArray.
var uri;
dump("Checking links in " + objects.Count() + " items ...\n");
for (var i = 0; i < objects.Count(); ++i)
{
var refobj = objects.GetElementAt(i).QueryInterface(Components.interfaces.nsIURIRefObject);
uri = refobj.GetNextURI();
dump(i + ": '" + uri + "'\n");
}
// Check only the last link, for now:
nsLinkChecker.LoadFromURI(uri);
}
};
//-----------------------------------------------------------------------------------
var nsImageCommand =
{
@ -1458,7 +1611,6 @@ var nsTableOrCellColorCommand =
}
};
//-----------------------------------------------------------------------------------
var nsPreferencesCommand =
{

Просмотреть файл

@ -25,12 +25,6 @@
// --------------------------- Output ---------------------------
function EditorSerialize()
{
var s = new XMLSerializer();
dump(s.serializeToString(editorShell.editorDocument) + "\n");
}
function EditorGetText()
{
if (editorShell) {
@ -74,7 +68,9 @@ function EditorTestSelection()
dump("Selection contains:\n");
// 3rd param = column to wrap
dump(selection.toString("text/plain", gOutputFormatted & gOutputSelectionOnly, 0) + "\n");
dump(selection.toStringWithFormat("text/plain",
gOutputFormatted & gOutputSelectionOnly,
0) + "\n");
var output;
@ -346,45 +342,6 @@ function EditorRunLog()
window._content.focus();
}
function EditorTableize()
{
// 1 = OutputSelectionOnly, 1024 = OutputLFLineBreak
// 256 = OutputEncodeEntities
var str = editorShell.GetContentsAs("text/html", 1+1024);
var newstr;
//dump("String to tableize is '" + str + "'\n");
// Replace nbsp with spaces:
newstr = str.replace(/\u00a0/g, " ");
// Trim trailing <p> or <br>
str = newstr.replace(/\s*<br>\s*$/, "");
newstr = str.replace(/\s*<p>\s*$/, "");
// Trim leading and trailing spaces
str = newstr.replace(/^\s+/, "");
newstr = str.replace(/\s+$/, "");
// Trim whitespace adjacent to <p> and <br> tags
str = newstr.replace(/\s+<p>\s+/g, "<br>");
newstr = str.replace(/\s+<br>\s+/g, "<br>");
// Put <td> wherever we see whitespace
str = newstr.replace(/ +/g, " <td>");
// End table row and start another for each br or p
newstr = str.replace(/\s*<br>\s*/g, "</tr>\n<tr><td>");
// Add the table tags and the opening and closing tr/td tags
str = "<table border=\"1\">\n<tr><td>" + newstr + "</tr>\n</table>\n";
//dump("Trying to insert '" + str + "'\n");
window.editorShell.InsertSource(str);
window._content.focus();
}
// --------------------------- TransactionManager ---------------------------

Просмотреть файл

@ -156,6 +156,8 @@
<command id="cmd_find" oncommand="goDoCommand('cmd_find')"/>
<command id="cmd_findNext" oncommand="goDoCommand('cmd_findNext')" label="&findAgainCmd.label;"/>
<command id="cmd_spelling" oncommand="goDoCommand('cmd_spelling')"/>
<command id="cmd_validate" oncommand="goDoCommand('cmd_validate')"/>
<command id="cmd_checkLinks" oncommand="goDoCommand('cmd_checkLinks')"/>
<command id="cmd_pasteQuote" oncommand="goDoCommand('cmd_pasteQuote')" label="&pasteAsQuotationCmd.label;"/>
</commandset>
@ -338,6 +340,8 @@
<menuitem id="menu_findnext" accesskey="&editfindnext.accesskey;" key="findnextkb" observes="cmd_findNext"/>
<menuseparator id="sep_checkspelling" class="hide-in-IM" />
<menuitem id="menu_checkspelling" accesskey="&editcheckspelling.accesskey;" key="checkspellingkb" observes="cmd_spelling" label="&checkSpellingCmd.label;"/>
<menuitem id="menu_validate" observes="cmd_validate"
label="&validateCmd.label;"/>
<menuseparator/>
<menuitem id="menu_preferences" observes="cmd_preferences"/>
</menupopup>
@ -812,8 +816,6 @@
oncommand="EditorGetText()"/>
<menuitem label="&outputHTMLCmd.label;"
oncommand="EditorGetHTML()"/>
<menuitem label="Dom Serializer"
oncommand="EditorSerialize()"/>
<menuseparator />
<menuitem label="&pasteAsQuotationCmd.label;"
accesskey="&editpastequotation.accesskey;"
@ -824,8 +826,8 @@
oncommand="editorShell.StripCites()"/>
<menuitem label="&insertTextCmd.label;"
oncommand="EditorInsertText('All good things come to those who wait. ')"/>
<menuitem label="Tableize"
oncommand="EditorTableize()"/>
<menuitem id="menu_checkLinks" observes="cmd_checkLinks"
label="&checkLinksCmd.label;"/>
<menuseparator />
<menuitem label="&testSelectionCmd.label;"
oncommand="EditorTestSelection()"/>

Просмотреть файл

@ -45,6 +45,7 @@ TextFiles=Text Files
AllFiles=All Files
BeforeClosing=before closing
BeforePreview=before viewing in Navigator
BeforeValidate=before validating the document
# LOCALIZATION NOTE (SaveFilePrompt): Don't translate %title% and %reason% (this is the reason for asking user to close, such as "before closing")
SaveFilePrompt=Save changes to "%title%" %reason%?
SaveFileFailed=Saving file failed!

Просмотреть файл

@ -108,6 +108,8 @@
<!ENTITY editfindnext.accesskey "n">
<!ENTITY editfindnext.keybinding "g">
<!ENTITY checkSpellingCmd.label "Check Spelling">
<!ENTITY validateCmd.label "Validate HTML">
<!ENTITY checkLinksCmd.label "Check Links">
<!ENTITY editcheckspelling.accesskey "s">
<!ENTITY editcheckspelling.keybinding "k">