diff --git a/mozilla/htmlparser/src/nsParserService.cpp b/mozilla/htmlparser/src/nsParserService.cpp
new file mode 100644
index 00000000000..f6c2ea8744c
--- /dev/null
+++ b/mozilla/htmlparser/src/nsParserService.cpp
@@ -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) && (aIdAddObserver(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;
+}
diff --git a/mozilla/htmlparser/src/nsParserService.h b/mozilla/htmlparser/src/nsParserService.h
new file mode 100644
index 00000000000..adce81fcfe2
--- /dev/null
+++ b/mozilla/htmlparser/src/nsParserService.h
@@ -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
diff --git a/mozilla/parser/htmlparser/src/nsParserService.cpp b/mozilla/parser/htmlparser/src/nsParserService.cpp
new file mode 100644
index 00000000000..f6c2ea8744c
--- /dev/null
+++ b/mozilla/parser/htmlparser/src/nsParserService.cpp
@@ -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) && (aIdAddObserver(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;
+}
diff --git a/mozilla/parser/htmlparser/src/nsParserService.h b/mozilla/parser/htmlparser/src/nsParserService.h
new file mode 100644
index 00000000000..adce81fcfe2
--- /dev/null
+++ b/mozilla/parser/htmlparser/src/nsParserService.h
@@ -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