зеркало из https://github.com/mozilla/gecko-dev.git
96364 - New files should go along with my previous checkin.
This commit is contained in:
Родитель
f31a0a3b23
Коммит
329ccb52d0
|
@ -0,0 +1,192 @@
|
|||
/* -*- 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 Communicator client 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "nsParserService.h"
|
||||
#include "nsHTMLEntities.h"
|
||||
#include "nsElementTable.h"
|
||||
|
||||
nsParserService::nsParserService() : mEntries(0)
|
||||
{
|
||||
NS_INIT_ISUPPORTS();
|
||||
}
|
||||
|
||||
nsParserService::~nsParserService()
|
||||
{
|
||||
nsObserverEntry *entry = nsnull;
|
||||
while(entry = NS_STATIC_CAST(nsObserverEntry*,mEntries.Pop())) {
|
||||
NS_RELEASE(entry);
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS1(nsParserService, nsIParserService)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::HTMLAtomTagToId(nsIAtom* aAtom, PRInt32* aId) const
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aAtom);
|
||||
|
||||
nsAutoString tagName;
|
||||
aAtom->ToString(tagName);
|
||||
*aId = nsHTMLTags::LookupTag(tagName);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::HTMLStringTagToId(const nsString &aTag, PRInt32* aId) const
|
||||
{
|
||||
*aId = nsHTMLTags::LookupTag(aTag);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::HTMLIdToStringTag(PRInt32 aId, nsString& aTag) const
|
||||
{
|
||||
aTag.AssignWithConversion( nsHTMLTags::GetStringValue((nsHTMLTag)aId) );
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::HTMLConvertEntityToUnicode(const nsString& aEntity,
|
||||
PRInt32* aUnicode) const
|
||||
{
|
||||
*aUnicode = nsHTMLEntities::EntityToUnicode(aEntity);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::HTMLConvertUnicodeToEntity(PRInt32 aUnicode,
|
||||
nsCString& aEntity) const
|
||||
{
|
||||
const char* str = nsHTMLEntities::UnicodeToEntity(aUnicode);
|
||||
if (str) {
|
||||
aEntity.Assign(str);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::IsContainer(PRInt32 aId, PRBool& aIsContainer) const
|
||||
{
|
||||
aIsContainer = nsHTMLElement::IsContainer((eHTMLTags)aId);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::IsBlock(PRInt32 aId, PRBool& aIsBlock) const
|
||||
{
|
||||
if((aId>eHTMLTag_unknown) && (aId<eHTMLTag_userdefined)) {
|
||||
aIsBlock=((gHTMLElements[aId].IsMemberOf(kBlock)) ||
|
||||
(gHTMLElements[aId].IsMemberOf(kBlockEntity)) ||
|
||||
(gHTMLElements[aId].IsMemberOf(kHeading)) ||
|
||||
(gHTMLElements[aId].IsMemberOf(kPreformatted))||
|
||||
(gHTMLElements[aId].IsMemberOf(kList)));
|
||||
}
|
||||
else {
|
||||
aIsBlock = PR_FALSE;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::RegisterObserver(nsIElementObserver* aObserver,
|
||||
const nsAString& aTopic,
|
||||
const eHTMLTags* aTags)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
nsObserverEntry* entry = GetEntry(aTopic);
|
||||
|
||||
if(!entry) {
|
||||
result = CreateEntry(aTopic,&entry);
|
||||
NS_ENSURE_SUCCESS(result,result);
|
||||
}
|
||||
|
||||
while (*aTags) {
|
||||
if(*aTags != eHTMLTag_userdefined && *aTags <= NS_HTML_TAG_MAX) {
|
||||
entry->AddObserver(aObserver,*aTags);
|
||||
}
|
||||
aTags++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::UnregisterObserver(nsIElementObserver* aObserver,
|
||||
const nsAString& aTopic)
|
||||
{
|
||||
PRInt32 count = mEntries.GetSize();
|
||||
|
||||
for (PRInt32 i=0; i < count; i++) {
|
||||
nsObserverEntry* entry = NS_STATIC_CAST(nsObserverEntry*,mEntries.ObjectAt(i));
|
||||
if (entry && entry->Matches(aTopic)) {
|
||||
entry->RemoveObserver(aObserver);
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::GetTopicObservers(const nsAString& aTopic,
|
||||
nsIObserverEntry** aEntry) {
|
||||
nsresult result = NS_OK;
|
||||
nsObserverEntry* entry = GetEntry(aTopic);
|
||||
|
||||
if (!entry) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
NS_ADDREF(*aEntry = entry);
|
||||
return result;
|
||||
}
|
||||
|
||||
// XXX This may be more efficient as a HashTable instead of linear search
|
||||
nsObserverEntry*
|
||||
nsParserService::GetEntry(const nsAString& aTopic)
|
||||
{
|
||||
PRInt32 index = 0;
|
||||
nsObserverEntry* entry = nsnull;
|
||||
|
||||
while (entry = NS_STATIC_CAST(nsObserverEntry*,mEntries.ObjectAt(index++))) {
|
||||
if (entry->Matches(aTopic)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsParserService::CreateEntry(const nsAString& aTopic, nsObserverEntry** aEntry)
|
||||
{
|
||||
*aEntry = new nsObserverEntry(aTopic);
|
||||
|
||||
if (!aEntry) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
NS_ADDREF(*aEntry);
|
||||
mEntries.Push(*aEntry);
|
||||
|
||||
return NS_OK;
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
/* -*- 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 Communicator client 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.
|
||||
*
|
||||
*/
|
||||
#ifndef NS_PARSERSERVICE_H__
|
||||
#define NS_PARSERSERVICE_H__
|
||||
|
||||
#include "nsIParserService.h"
|
||||
#include "nsDTDUtils.h"
|
||||
#include "nsVoidArray.h"
|
||||
|
||||
class nsParserService : public nsIParserService {
|
||||
public:
|
||||
nsParserService();
|
||||
virtual ~nsParserService();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD HTMLAtomTagToId(nsIAtom* aAtom, PRInt32* aId) const;
|
||||
|
||||
NS_IMETHOD HTMLStringTagToId(const nsString &aTag, PRInt32* aId) const;
|
||||
|
||||
NS_IMETHOD HTMLIdToStringTag(PRInt32 aId, nsString& aTag) const;
|
||||
|
||||
NS_IMETHOD HTMLConvertEntityToUnicode(const nsString& aEntity,
|
||||
PRInt32* aUnicode) const;
|
||||
NS_IMETHOD HTMLConvertUnicodeToEntity(PRInt32 aUnicode,
|
||||
nsCString& aEntity) const;
|
||||
NS_IMETHOD IsContainer(PRInt32 aId, PRBool& aIsContainer) const;
|
||||
NS_IMETHOD IsBlock(PRInt32 aId, PRBool& aIsBlock) const;
|
||||
|
||||
// Observer mechanism5
|
||||
NS_IMETHOD RegisterObserver(nsIElementObserver* aObserver,
|
||||
const nsAString& aTopic,
|
||||
const eHTMLTags* aTags = nsnull);
|
||||
|
||||
NS_IMETHOD UnregisterObserver(nsIElementObserver* aObserver,
|
||||
const nsAString& aTopic);
|
||||
NS_IMETHOD GetTopicObservers(const nsAString& aTopic,
|
||||
nsIObserverEntry** aEntry);
|
||||
protected:
|
||||
nsObserverEntry* GetEntry(const nsAString& aTopic);
|
||||
nsresult CreateEntry(const nsAString& aTopic,
|
||||
nsObserverEntry** aEntry);
|
||||
|
||||
nsDeque mEntries; //each topic holds a list of observers per tag.
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,192 @@
|
|||
/* -*- 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 Communicator client 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "nsParserService.h"
|
||||
#include "nsHTMLEntities.h"
|
||||
#include "nsElementTable.h"
|
||||
|
||||
nsParserService::nsParserService() : mEntries(0)
|
||||
{
|
||||
NS_INIT_ISUPPORTS();
|
||||
}
|
||||
|
||||
nsParserService::~nsParserService()
|
||||
{
|
||||
nsObserverEntry *entry = nsnull;
|
||||
while(entry = NS_STATIC_CAST(nsObserverEntry*,mEntries.Pop())) {
|
||||
NS_RELEASE(entry);
|
||||
}
|
||||
}
|
||||
|
||||
NS_IMPL_ISUPPORTS1(nsParserService, nsIParserService)
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::HTMLAtomTagToId(nsIAtom* aAtom, PRInt32* aId) const
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(aAtom);
|
||||
|
||||
nsAutoString tagName;
|
||||
aAtom->ToString(tagName);
|
||||
*aId = nsHTMLTags::LookupTag(tagName);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::HTMLStringTagToId(const nsString &aTag, PRInt32* aId) const
|
||||
{
|
||||
*aId = nsHTMLTags::LookupTag(aTag);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::HTMLIdToStringTag(PRInt32 aId, nsString& aTag) const
|
||||
{
|
||||
aTag.AssignWithConversion( nsHTMLTags::GetStringValue((nsHTMLTag)aId) );
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::HTMLConvertEntityToUnicode(const nsString& aEntity,
|
||||
PRInt32* aUnicode) const
|
||||
{
|
||||
*aUnicode = nsHTMLEntities::EntityToUnicode(aEntity);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::HTMLConvertUnicodeToEntity(PRInt32 aUnicode,
|
||||
nsCString& aEntity) const
|
||||
{
|
||||
const char* str = nsHTMLEntities::UnicodeToEntity(aUnicode);
|
||||
if (str) {
|
||||
aEntity.Assign(str);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::IsContainer(PRInt32 aId, PRBool& aIsContainer) const
|
||||
{
|
||||
aIsContainer = nsHTMLElement::IsContainer((eHTMLTags)aId);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::IsBlock(PRInt32 aId, PRBool& aIsBlock) const
|
||||
{
|
||||
if((aId>eHTMLTag_unknown) && (aId<eHTMLTag_userdefined)) {
|
||||
aIsBlock=((gHTMLElements[aId].IsMemberOf(kBlock)) ||
|
||||
(gHTMLElements[aId].IsMemberOf(kBlockEntity)) ||
|
||||
(gHTMLElements[aId].IsMemberOf(kHeading)) ||
|
||||
(gHTMLElements[aId].IsMemberOf(kPreformatted))||
|
||||
(gHTMLElements[aId].IsMemberOf(kList)));
|
||||
}
|
||||
else {
|
||||
aIsBlock = PR_FALSE;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::RegisterObserver(nsIElementObserver* aObserver,
|
||||
const nsAString& aTopic,
|
||||
const eHTMLTags* aTags)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
nsObserverEntry* entry = GetEntry(aTopic);
|
||||
|
||||
if(!entry) {
|
||||
result = CreateEntry(aTopic,&entry);
|
||||
NS_ENSURE_SUCCESS(result,result);
|
||||
}
|
||||
|
||||
while (*aTags) {
|
||||
if(*aTags != eHTMLTag_userdefined && *aTags <= NS_HTML_TAG_MAX) {
|
||||
entry->AddObserver(aObserver,*aTags);
|
||||
}
|
||||
aTags++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::UnregisterObserver(nsIElementObserver* aObserver,
|
||||
const nsAString& aTopic)
|
||||
{
|
||||
PRInt32 count = mEntries.GetSize();
|
||||
|
||||
for (PRInt32 i=0; i < count; i++) {
|
||||
nsObserverEntry* entry = NS_STATIC_CAST(nsObserverEntry*,mEntries.ObjectAt(i));
|
||||
if (entry && entry->Matches(aTopic)) {
|
||||
entry->RemoveObserver(aObserver);
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsParserService::GetTopicObservers(const nsAString& aTopic,
|
||||
nsIObserverEntry** aEntry) {
|
||||
nsresult result = NS_OK;
|
||||
nsObserverEntry* entry = GetEntry(aTopic);
|
||||
|
||||
if (!entry) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
NS_ADDREF(*aEntry = entry);
|
||||
return result;
|
||||
}
|
||||
|
||||
// XXX This may be more efficient as a HashTable instead of linear search
|
||||
nsObserverEntry*
|
||||
nsParserService::GetEntry(const nsAString& aTopic)
|
||||
{
|
||||
PRInt32 index = 0;
|
||||
nsObserverEntry* entry = nsnull;
|
||||
|
||||
while (entry = NS_STATIC_CAST(nsObserverEntry*,mEntries.ObjectAt(index++))) {
|
||||
if (entry->Matches(aTopic)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return entry;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsParserService::CreateEntry(const nsAString& aTopic, nsObserverEntry** aEntry)
|
||||
{
|
||||
*aEntry = new nsObserverEntry(aTopic);
|
||||
|
||||
if (!aEntry) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
NS_ADDREF(*aEntry);
|
||||
mEntries.Push(*aEntry);
|
||||
|
||||
return NS_OK;
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
/* -*- 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 Communicator client 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.
|
||||
*
|
||||
*/
|
||||
#ifndef NS_PARSERSERVICE_H__
|
||||
#define NS_PARSERSERVICE_H__
|
||||
|
||||
#include "nsIParserService.h"
|
||||
#include "nsDTDUtils.h"
|
||||
#include "nsVoidArray.h"
|
||||
|
||||
class nsParserService : public nsIParserService {
|
||||
public:
|
||||
nsParserService();
|
||||
virtual ~nsParserService();
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD HTMLAtomTagToId(nsIAtom* aAtom, PRInt32* aId) const;
|
||||
|
||||
NS_IMETHOD HTMLStringTagToId(const nsString &aTag, PRInt32* aId) const;
|
||||
|
||||
NS_IMETHOD HTMLIdToStringTag(PRInt32 aId, nsString& aTag) const;
|
||||
|
||||
NS_IMETHOD HTMLConvertEntityToUnicode(const nsString& aEntity,
|
||||
PRInt32* aUnicode) const;
|
||||
NS_IMETHOD HTMLConvertUnicodeToEntity(PRInt32 aUnicode,
|
||||
nsCString& aEntity) const;
|
||||
NS_IMETHOD IsContainer(PRInt32 aId, PRBool& aIsContainer) const;
|
||||
NS_IMETHOD IsBlock(PRInt32 aId, PRBool& aIsBlock) const;
|
||||
|
||||
// Observer mechanism5
|
||||
NS_IMETHOD RegisterObserver(nsIElementObserver* aObserver,
|
||||
const nsAString& aTopic,
|
||||
const eHTMLTags* aTags = nsnull);
|
||||
|
||||
NS_IMETHOD UnregisterObserver(nsIElementObserver* aObserver,
|
||||
const nsAString& aTopic);
|
||||
NS_IMETHOD GetTopicObservers(const nsAString& aTopic,
|
||||
nsIObserverEntry** aEntry);
|
||||
protected:
|
||||
nsObserverEntry* GetEntry(const nsAString& aTopic);
|
||||
nsresult CreateEntry(const nsAString& aTopic,
|
||||
nsObserverEntry** aEntry);
|
||||
|
||||
nsDeque mEntries; //each topic holds a list of observers per tag.
|
||||
};
|
||||
|
||||
#endif
|
Загрузка…
Ссылка в новой задаче