1998-04-14 00:24:54 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2001-09-26 04:40:45 +04:00
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
|
|
|
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
1998-04-14 00:24:54 +04:00
|
|
|
*
|
2001-09-26 04:40:45 +04:00
|
|
|
* 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.
|
1998-04-14 00:24:54 +04:00
|
|
|
*
|
1999-11-06 06:43:54 +03:00
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
2001-09-26 04:40:45 +04:00
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either 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 NPL, 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 NPL, the GPL or the LGPL.
|
1999-11-06 06:43:54 +03:00
|
|
|
*
|
2001-09-26 04:40:45 +04:00
|
|
|
* ***** END LICENSE BLOCK ***** */
|
1998-05-22 00:38:32 +04:00
|
|
|
|
1998-04-14 00:24:54 +04:00
|
|
|
/**
|
|
|
|
* MODULE NOTES:
|
|
|
|
* @update gess 4/1/98
|
|
|
|
*
|
|
|
|
* This class does two primary jobs:
|
|
|
|
* 1) It iterates the tokens provided during the
|
|
|
|
* tokenization process, identifing where elements
|
|
|
|
* begin and end (doing validation and normalization).
|
|
|
|
* 2) It controls and coordinates with an instance of
|
|
|
|
* the IContentSink interface, to coordinate the
|
|
|
|
* the production of the content model.
|
|
|
|
*
|
|
|
|
* The basic operation of this class assumes that an HTML
|
|
|
|
* document is non-normalized. Therefore, we don't process
|
|
|
|
* the document in a normalized way. Don't bother to look
|
|
|
|
* for methods like: doHead() or doBody().
|
|
|
|
*
|
|
|
|
* Instead, in order to be backward compatible, we must
|
|
|
|
* scan the set of tokens and perform this basic set of
|
|
|
|
* operations:
|
|
|
|
* 1) Determine the token type (easy, since the tokens know)
|
|
|
|
* 2) Determine the appropriate section of the HTML document
|
|
|
|
* each token belongs in (HTML,HEAD,BODY,FRAMESET).
|
|
|
|
* 3) Insert content into our document (via the sink) into
|
|
|
|
* the correct section.
|
|
|
|
* 4) In the case of tags that belong in the BODY, we must
|
|
|
|
* ensure that our underlying document state reflects
|
|
|
|
* the appropriate context for our tag.
|
|
|
|
*
|
|
|
|
* For example,if we see a <TR>, we must ensure our
|
|
|
|
* document contains a table into which the row can
|
|
|
|
* be placed. This may result in "implicit containers"
|
|
|
|
* created to ensure a well-formed document.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
1998-06-19 05:00:27 +04:00
|
|
|
#ifndef NS_PARSER__
|
|
|
|
#define NS_PARSER__
|
1998-04-14 00:24:54 +04:00
|
|
|
|
|
|
|
#include "nsIParser.h"
|
|
|
|
#include "nsDeque.h"
|
|
|
|
#include "nsParserNode.h"
|
1998-05-15 02:19:08 +04:00
|
|
|
#include "nsIURL.h"
|
1998-07-14 01:13:09 +04:00
|
|
|
#include "CParserContext.h"
|
1998-07-31 02:42:27 +04:00
|
|
|
#include "nsParserCIID.h"
|
1999-01-26 04:24:31 +03:00
|
|
|
#include "nsITokenizer.h"
|
1999-04-05 10:55:49 +04:00
|
|
|
#include "nsHTMLTags.h"
|
1999-07-17 01:07:54 +04:00
|
|
|
#include "nsDTDUtils.h"
|
1999-11-10 06:41:09 +03:00
|
|
|
#include "nsTimer.h"
|
2001-06-21 06:06:23 +04:00
|
|
|
#include "nsIEventQueue.h"
|
1998-04-14 00:24:54 +04:00
|
|
|
|
|
|
|
class IContentSink;
|
1998-04-23 03:56:57 +04:00
|
|
|
class nsIDTD;
|
1999-01-09 04:09:02 +03:00
|
|
|
class nsScanner;
|
1998-06-19 02:57:25 +04:00
|
|
|
class nsIParserFilter;
|
1999-06-21 04:33:51 +04:00
|
|
|
class nsIProgressEventSink;
|
1999-04-05 10:55:49 +04:00
|
|
|
|
1999-07-22 21:44:19 +04:00
|
|
|
#ifdef XP_WIN
|
1999-01-26 04:24:31 +03:00
|
|
|
#pragma warning( disable : 4275 )
|
1999-02-04 01:58:49 +03:00
|
|
|
#endif
|
|
|
|
|
1999-01-26 04:24:31 +03:00
|
|
|
|
Checking in for bug 50742, this change removes the use of XIF in mozilla and replaces the XIF converter with a HTML (and XML) serializer.
Contextual information added to HTML copy and intelligence added to HTML paste in the editor (fixes bugs 47014, 50568 and 46554, and partly (at least) fixes bug 53188).
Code written by vidur, jfrancis, jst, akkana. Tested by jfrancis, akkana, vidur, jst, kin. Reviwed (and super reviewed) by waterson, vidur, kin, jfrancis, jst
2000-10-07 14:57:30 +04:00
|
|
|
class nsParser : public nsIParser,
|
|
|
|
public nsIStreamListener{
|
1999-10-28 11:53:21 +04:00
|
|
|
|
|
|
|
|
1998-04-25 23:45:14 +04:00
|
|
|
public:
|
1999-10-28 11:53:21 +04:00
|
|
|
friend class CTokenHandler;
|
|
|
|
static void FreeSharedObjects(void);
|
1998-04-14 00:24:54 +04:00
|
|
|
|
|
|
|
NS_DECL_ISUPPORTS
|
1998-05-12 04:59:32 +04:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* default constructor
|
|
|
|
* @update gess5/11/98
|
|
|
|
*/
|
1999-01-26 04:24:31 +03:00
|
|
|
nsParser(nsITokenObserver* anObserver=0);
|
1998-05-12 04:59:32 +04:00
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Destructor
|
|
|
|
* @update gess5/11/98
|
|
|
|
*/
|
1998-07-14 01:42:45 +04:00
|
|
|
virtual ~nsParser();
|
1998-05-12 04:59:32 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Select given content sink into parser for parser output
|
|
|
|
* @update gess5/11/98
|
|
|
|
* @param aSink is the new sink to be used by parser
|
|
|
|
* @return old sink, or NULL
|
|
|
|
*/
|
|
|
|
virtual nsIContentSink* SetContentSink(nsIContentSink* aSink);
|
1998-11-26 05:55:59 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* retrive the sink set into the parser
|
|
|
|
* @update gess5/11/98
|
|
|
|
* @param aSink is the new sink to be used by parser
|
|
|
|
* @return old sink, or NULL
|
|
|
|
*/
|
|
|
|
virtual nsIContentSink* GetContentSink(void);
|
1998-06-18 03:13:28 +04:00
|
|
|
|
1998-11-11 14:55:32 +03:00
|
|
|
/**
|
|
|
|
* Call this method once you've created a parser, and want to instruct it
|
|
|
|
* about the command which caused the parser to be constructed. For example,
|
|
|
|
* this allows us to select a DTD which can do, say, view-source.
|
|
|
|
*
|
|
|
|
* @update gess 3/25/98
|
|
|
|
* @param aContentSink -- ptr to content sink that will receive output
|
|
|
|
* @return ptr to previously set contentsink (usually null)
|
|
|
|
*/
|
2000-05-01 10:58:53 +04:00
|
|
|
virtual void GetCommand(nsString& aCommand);
|
1998-11-11 14:55:32 +03:00
|
|
|
virtual void SetCommand(const char* aCommand);
|
2000-03-25 06:35:50 +03:00
|
|
|
virtual void SetCommand(eParserCommands aParserCommand);
|
1998-11-11 14:55:32 +03:00
|
|
|
|
1999-04-26 21:49:45 +04:00
|
|
|
/**
|
|
|
|
* Call this method once you've created a parser, and want to instruct it
|
|
|
|
* about what charset to load
|
|
|
|
*
|
|
|
|
* @update ftang 4/23/99
|
|
|
|
* @param aCharset- the charest of a document
|
|
|
|
* @param aCharsetSource- the soure of the chares
|
|
|
|
* @return nada
|
|
|
|
*/
|
|
|
|
virtual void SetDocumentCharset(nsString& aCharset, nsCharsetSource aSource);
|
|
|
|
|
1999-05-18 05:30:21 +04:00
|
|
|
void GetDocumentCharset(nsString& oCharset, nsCharsetSource& oSource)
|
|
|
|
{
|
|
|
|
oCharset = mCharset;
|
|
|
|
oSource = mCharsetSource;
|
|
|
|
}
|
|
|
|
|
1999-04-26 21:49:45 +04:00
|
|
|
|
1998-06-19 05:00:27 +04:00
|
|
|
virtual nsIParserFilter* SetParserFilter(nsIParserFilter* aFilter);
|
1998-06-18 03:13:28 +04:00
|
|
|
|
1998-07-02 12:14:22 +04:00
|
|
|
virtual void RegisterDTD(nsIDTD* aDTD);
|
|
|
|
|
1998-06-18 03:13:28 +04:00
|
|
|
/**
|
1998-08-12 12:53:55 +04:00
|
|
|
* Retrieve the scanner from the topmost parser context
|
1998-06-18 03:13:28 +04:00
|
|
|
*
|
1998-08-12 12:53:55 +04:00
|
|
|
* @update gess 6/9/98
|
|
|
|
* @return ptr to scanner
|
|
|
|
*/
|
2000-05-04 09:53:52 +04:00
|
|
|
virtual nsDTDMode GetParseMode(void);
|
1998-08-12 12:53:55 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve the scanner from the topmost parser context
|
1998-06-18 03:13:28 +04:00
|
|
|
*
|
|
|
|
* @update gess 6/9/98
|
1998-08-12 12:53:55 +04:00
|
|
|
* @return ptr to scanner
|
1998-06-18 03:13:28 +04:00
|
|
|
*/
|
1999-01-09 04:09:02 +03:00
|
|
|
virtual nsScanner* GetScanner(void);
|
1998-05-12 04:59:32 +04:00
|
|
|
|
|
|
|
/**
|
1998-07-14 01:13:09 +04:00
|
|
|
* Cause parser to parse input from given URL
|
1998-05-12 04:59:32 +04:00
|
|
|
* @update gess5/11/98
|
|
|
|
* @param aURL is a descriptor for source document
|
1998-06-01 23:51:52 +04:00
|
|
|
* @param aListener is a listener to forward notifications to
|
1998-05-12 04:59:32 +04:00
|
|
|
* @return TRUE if all went well -- FALSE otherwise
|
|
|
|
*/
|
2001-04-10 10:01:08 +04:00
|
|
|
virtual nsresult Parse(nsIURI* aURL,nsIRequestObserver* aListener,PRBool aEnableVerify=PR_FALSE,void* aKey=0,nsDTDMode aMode=eDTDMode_autodetect);
|
1998-07-14 01:13:09 +04:00
|
|
|
|
1998-07-10 09:35:23 +04:00
|
|
|
/**
|
|
|
|
* Cause parser to parse input from given stream
|
|
|
|
* @update gess5/11/98
|
|
|
|
* @param aStream is the i/o source
|
|
|
|
* @return TRUE if all went well -- FALSE otherwise
|
|
|
|
*/
|
2001-11-14 04:33:42 +03:00
|
|
|
virtual nsresult Parse(nsIInputStream& aStream,const nsAReadableString& aMimeType,PRBool aEnableVerify=PR_FALSE,void* aKey=0,nsDTDMode aMode=eDTDMode_autodetect);
|
1998-07-10 09:35:23 +04:00
|
|
|
|
1998-05-15 02:19:08 +04:00
|
|
|
/**
|
|
|
|
* @update gess5/11/98
|
|
|
|
* @param anHTMLString contains a string-full of real HTML
|
|
|
|
* @param appendTokens tells us whether we should insert tokens inline, or append them.
|
|
|
|
* @return TRUE if all went well -- FALSE otherwise
|
|
|
|
*/
|
2001-10-16 05:31:49 +04:00
|
|
|
virtual nsresult Parse(const nsAReadableString& aSourceBuffer,void* aKey,const nsAReadableString& aContentType,PRBool aEnableVerify=PR_FALSE,PRBool aLastCall=PR_FALSE,nsDTDMode aMode=eDTDMode_autodetect);
|
1998-05-12 04:59:32 +04:00
|
|
|
|
2001-10-20 00:48:18 +04:00
|
|
|
virtual nsresult ParseFragment(const nsAReadableString& aSourceBuffer,
|
|
|
|
void* aKey,
|
|
|
|
nsVoidArray& aTagStack,
|
|
|
|
PRUint32 anInsertPos,
|
2001-11-14 04:33:42 +03:00
|
|
|
const nsAReadableString& aContentType,
|
2001-10-20 00:48:18 +04:00
|
|
|
nsDTDMode aMode=eDTDMode_autodetect);
|
1999-04-05 10:55:49 +04:00
|
|
|
|
1998-09-02 11:12:49 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Call this when you want control whether or not the parser will parse
|
|
|
|
* and tokenize input (TRUE), or whether it just caches input to be
|
|
|
|
* parsed later (FALSE).
|
|
|
|
*
|
|
|
|
* @update gess 9/1/98
|
|
|
|
* @param aState determines whether we parse/tokenize or just cache.
|
|
|
|
* @return current state
|
|
|
|
*/
|
2001-02-10 01:36:23 +03:00
|
|
|
virtual nsresult ContinueParsing();
|
2001-02-07 02:35:29 +03:00
|
|
|
virtual void BlockParser();
|
|
|
|
virtual void UnblockParser();
|
1999-07-08 08:39:38 +04:00
|
|
|
virtual nsresult Terminate(void);
|
1998-09-02 11:12:49 +04:00
|
|
|
|
1999-04-14 02:22:51 +04:00
|
|
|
/**
|
|
|
|
* Call this to query whether the parser is enabled or not.
|
|
|
|
*
|
|
|
|
* @update vidur 4/12/99
|
|
|
|
* @return current state
|
|
|
|
*/
|
|
|
|
virtual PRBool IsParserEnabled();
|
1999-02-01 07:24:37 +03:00
|
|
|
|
2001-06-21 06:06:23 +04:00
|
|
|
/**
|
|
|
|
* Call this to query whether the parser thinks it's done with parsing.
|
|
|
|
*
|
|
|
|
* @update rickg 5/12/01
|
|
|
|
* @return complete state
|
|
|
|
*/
|
|
|
|
virtual PRBool IsComplete();
|
|
|
|
|
1999-02-01 07:24:37 +03:00
|
|
|
/**
|
|
|
|
* This rather arcane method (hack) is used as a signal between the
|
|
|
|
* DTD and the parser. It allows the DTD to tell the parser that content
|
|
|
|
* that comes through (parser::parser(string)) but not consumed should
|
|
|
|
* propagate into the next string based parse call.
|
|
|
|
*
|
|
|
|
* @update gess 9/1/98
|
|
|
|
* @param aState determines whether we propagate unused string content.
|
|
|
|
* @return current state
|
|
|
|
*/
|
|
|
|
void SetUnusedInput(nsString& aBuffer);
|
|
|
|
|
1998-05-12 04:59:32 +04:00
|
|
|
/**
|
|
|
|
* This method gets called (automatically) during incremental parsing
|
|
|
|
* @update gess5/11/98
|
|
|
|
* @return TRUE if all went well, otherwise FALSE
|
|
|
|
*/
|
2000-03-11 11:08:24 +03:00
|
|
|
virtual nsresult ResumeParse(PRBool allowIteration=PR_TRUE, PRBool aIsFinalChunk=PR_FALSE);
|
1998-05-12 04:59:32 +04:00
|
|
|
|
2001-10-16 09:31:36 +04:00
|
|
|
#ifdef DEBUG
|
1999-09-02 22:30:31 +04:00
|
|
|
void DebugDumpSource(nsOutputStream& anOutput);
|
2001-10-16 09:31:36 +04:00
|
|
|
#endif
|
1998-05-12 04:59:32 +04:00
|
|
|
|
1998-06-18 03:13:28 +04:00
|
|
|
//*********************************************
|
1998-05-15 02:19:08 +04:00
|
|
|
// These methods are callback methods used by
|
|
|
|
// net lib to let us know about our inputstream.
|
|
|
|
//*********************************************
|
2001-04-10 10:01:08 +04:00
|
|
|
// nsIRequestObserver methods:
|
|
|
|
NS_DECL_NSIREQUESTOBSERVER
|
1999-08-22 17:26:18 +04:00
|
|
|
|
1999-06-21 04:33:51 +04:00
|
|
|
// nsIStreamListener methods:
|
1999-08-22 17:26:18 +04:00
|
|
|
NS_DECL_NSISTREAMLISTENER
|
|
|
|
|
1999-01-26 04:24:31 +03:00
|
|
|
void PushContext(CParserContext& aContext);
|
|
|
|
CParserContext* PopContext();
|
|
|
|
CParserContext* PeekContext() {return mParserContext;}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @update gess 1/22/99
|
|
|
|
* @param
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
virtual nsITokenizer* GetTokenizer(void);
|
|
|
|
|
2001-08-22 04:38:46 +04:00
|
|
|
/**
|
|
|
|
* Get the channel associated with this parser
|
|
|
|
* @update harishd,gagan 07/17/01
|
|
|
|
* @param aChannel out param that will contain the result
|
|
|
|
* @return NS_OK if successful
|
|
|
|
*/
|
|
|
|
NS_IMETHOD GetChannel(nsIChannel** aChannel);
|
|
|
|
|
1999-10-01 02:01:48 +04:00
|
|
|
/**
|
|
|
|
* Get the DTD associated with this parser
|
|
|
|
* @update vidur 9/29/99
|
|
|
|
* @param aDTD out param that will contain the result
|
|
|
|
* @return NS_OK if successful, NS_ERROR_FAILURE for runtime error
|
|
|
|
*/
|
|
|
|
NS_IMETHOD GetDTD(nsIDTD** aDTD);
|
2001-09-29 03:08:17 +04:00
|
|
|
|
2000-08-29 03:45:08 +04:00
|
|
|
/**
|
|
|
|
* Call this method to determine a DTD for a DOCTYPE
|
|
|
|
*
|
|
|
|
* @update harishd 05/01/00
|
|
|
|
* @param aDTD -- Carries the deduced ( from DOCTYPE ) DTD.
|
|
|
|
* @param aDocTypeStr -- A doctype for which a DTD is to be selected.
|
|
|
|
* @param aMimeType -- A mimetype for which a DTD is to be selected.
|
|
|
|
Note: aParseMode might be required.
|
|
|
|
* @param aCommand -- A command for which a DTD is to be selected.
|
|
|
|
* @param aParseMode -- Used with aMimeType to choose the correct DTD.
|
|
|
|
* @return NS_OK if succeeded else ERROR.
|
|
|
|
*/
|
|
|
|
NS_IMETHOD CreateCompatibleDTD(nsIDTD** aDTD,
|
|
|
|
nsString* aDocTypeStr,
|
|
|
|
eParserCommands aCommand,
|
|
|
|
const nsString* aMimeType=nsnull,
|
|
|
|
nsDTDMode aDTDMode=eDTDMode_unknown);
|
2000-05-14 23:24:59 +04:00
|
|
|
|
2001-06-30 02:56:58 +04:00
|
|
|
/**
|
|
|
|
* Detects the existence of a META tag with charset information in
|
|
|
|
* the given buffer.
|
|
|
|
*/
|
|
|
|
PRBool DetectMetaTag(const char* aBytes,
|
|
|
|
PRInt32 aLen,
|
|
|
|
nsString& oCharset,
|
|
|
|
nsCharsetSource& oCharsetSource);
|
|
|
|
|
|
|
|
void SetSinkCharset(nsAWritableString& aCharset);
|
|
|
|
|
2001-06-21 06:06:23 +04:00
|
|
|
/**
|
|
|
|
* Removes continue parsing events
|
|
|
|
* @update kmcclusk 5/18/98
|
|
|
|
*/
|
|
|
|
|
|
|
|
NS_IMETHODIMP CancelParsingEvents();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Indicates whether the parser is in a state where it
|
|
|
|
* can be interrupted.
|
|
|
|
* @return PR_TRUE if parser can be interrupted, PR_FALSE if it can not be interrupted.
|
|
|
|
* @update kmcclusk 5/18/98
|
|
|
|
*/
|
|
|
|
PRBool CanInterrupt(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set to parser state to indicate whether parsing tokens can be interrupted
|
|
|
|
* @param aCanInterrupt PR_TRUE if parser can be interrupted, PR_FALSE if it can not be interrupted.
|
|
|
|
* @update kmcclusk 5/18/98
|
|
|
|
*/
|
|
|
|
void SetCanInterrupt(PRBool aCanInterrupt);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is called when the final chunk has been
|
|
|
|
* passed to the parser and the content sink has
|
|
|
|
* interrupted token processing. It schedules
|
|
|
|
* a ParserContinue PL_Event which will ask the parser
|
|
|
|
* to HandleParserContinueEvent when it is handled.
|
|
|
|
* @update kmcclusk6/1/2001
|
|
|
|
*/
|
|
|
|
nsresult PostContinueEvent();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Fired when the continue parse event is triggered.
|
|
|
|
* @update kmcclusk 5/18/98
|
|
|
|
*/
|
|
|
|
void HandleParserContinueEvent(void);
|
|
|
|
|
1998-05-12 04:59:32 +04:00
|
|
|
protected:
|
|
|
|
|
|
|
|
/**
|
1998-05-22 00:38:32 +04:00
|
|
|
*
|
|
|
|
* @update gess5/18/98
|
|
|
|
* @param
|
|
|
|
* @return
|
1998-05-12 04:59:32 +04:00
|
|
|
*/
|
2000-03-11 11:08:24 +03:00
|
|
|
nsresult WillBuildModel(nsString& aFilename);
|
1998-05-12 04:59:32 +04:00
|
|
|
|
|
|
|
/**
|
1998-05-22 00:38:32 +04:00
|
|
|
*
|
|
|
|
* @update gess5/18/98
|
|
|
|
* @param
|
|
|
|
* @return
|
1998-05-12 04:59:32 +04:00
|
|
|
*/
|
1999-01-09 04:09:02 +03:00
|
|
|
nsresult DidBuildModel(nsresult anErrorCode);
|
1998-05-12 04:59:32 +04:00
|
|
|
|
|
|
|
/**
|
1998-05-22 00:38:32 +04:00
|
|
|
* This method gets called when the tokens have been consumed, and it's time
|
|
|
|
* to build the model via the content sink.
|
1998-05-12 04:59:32 +04:00
|
|
|
* @update gess5/11/98
|
1998-05-22 00:38:32 +04:00
|
|
|
* @return YES if model building went well -- NO otherwise.
|
1998-05-12 04:59:32 +04:00
|
|
|
*/
|
1999-01-09 04:09:02 +03:00
|
|
|
virtual nsresult BuildModel(void);
|
1998-07-30 03:43:20 +04:00
|
|
|
|
1998-06-18 03:13:28 +04:00
|
|
|
private:
|
1998-05-12 04:59:32 +04:00
|
|
|
|
1998-06-18 03:13:28 +04:00
|
|
|
/*******************************************
|
|
|
|
These are the tokenization methods...
|
|
|
|
*******************************************/
|
1998-05-12 04:59:32 +04:00
|
|
|
|
|
|
|
/**
|
1998-06-18 03:13:28 +04:00
|
|
|
* Part of the code sandwich, this gets called right before
|
|
|
|
* the tokenization process begins. The main reason for
|
|
|
|
* this call is to allow the delegate to do initialization.
|
|
|
|
*
|
|
|
|
* @update gess 3/25/98
|
|
|
|
* @param
|
|
|
|
* @return TRUE if it's ok to proceed
|
1998-05-12 04:59:32 +04:00
|
|
|
*/
|
1999-07-15 12:23:37 +04:00
|
|
|
PRBool WillTokenize(PRBool aIsFinalChunk = PR_FALSE);
|
1998-05-12 04:59:32 +04:00
|
|
|
|
1998-07-14 01:13:09 +04:00
|
|
|
|
1998-05-12 04:59:32 +04:00
|
|
|
/**
|
1998-06-18 03:13:28 +04:00
|
|
|
* This is the primary control routine. It iteratively
|
|
|
|
* consumes tokens until an error occurs or you run out
|
|
|
|
* of data.
|
|
|
|
*
|
|
|
|
* @update gess 3/25/98
|
|
|
|
* @return error code
|
1998-05-12 04:59:32 +04:00
|
|
|
*/
|
1999-07-15 12:23:37 +04:00
|
|
|
nsresult Tokenize(PRBool aIsFinalChunk = PR_FALSE);
|
1998-05-12 04:59:32 +04:00
|
|
|
|
|
|
|
/**
|
1998-06-18 03:13:28 +04:00
|
|
|
* This is the tail-end of the code sandwich for the
|
|
|
|
* tokenization process. It gets called once tokenziation
|
|
|
|
* has completed.
|
|
|
|
*
|
|
|
|
* @update gess 3/25/98
|
|
|
|
* @param
|
|
|
|
* @return TRUE if all went well
|
1998-05-12 04:59:32 +04:00
|
|
|
*/
|
1999-07-15 12:23:37 +04:00
|
|
|
PRBool DidTokenize(PRBool aIsFinalChunk = PR_FALSE);
|
2001-06-21 06:06:23 +04:00
|
|
|
|
|
|
|
|
1998-05-15 02:19:08 +04:00
|
|
|
protected:
|
1998-05-12 04:59:32 +04:00
|
|
|
//*********************************************
|
|
|
|
// And now, some data members...
|
|
|
|
//*********************************************
|
1998-11-21 10:48:49 +03:00
|
|
|
|
|
|
|
|
1998-07-14 01:13:09 +04:00
|
|
|
CParserContext* mParserContext;
|
1998-07-17 06:35:23 +04:00
|
|
|
PRInt32 mMajorIteration;
|
|
|
|
PRInt32 mMinorIteration;
|
1998-07-14 01:13:09 +04:00
|
|
|
|
2001-04-10 10:01:08 +04:00
|
|
|
nsIRequestObserver* mObserver;
|
1998-07-14 01:13:09 +04:00
|
|
|
nsIContentSink* mSink;
|
2001-06-21 06:06:23 +04:00
|
|
|
|
1998-07-14 01:13:09 +04:00
|
|
|
nsIParserFilter* mParserFilter;
|
1998-07-30 03:43:20 +04:00
|
|
|
PRBool mDTDVerification;
|
2000-03-25 06:35:50 +03:00
|
|
|
eParserCommands mCommand;
|
1998-12-11 20:02:37 +03:00
|
|
|
PRInt32 mStreamStatus;
|
1999-01-26 04:24:31 +03:00
|
|
|
nsITokenObserver* mTokenObserver;
|
1999-02-01 07:24:37 +03:00
|
|
|
nsString mUnusedInput;
|
1999-04-26 21:49:45 +04:00
|
|
|
nsString mCharset;
|
|
|
|
nsCharsetSource mCharsetSource;
|
1999-05-19 09:01:46 +04:00
|
|
|
nsresult mInternalState;
|
1999-11-23 06:09:12 +03:00
|
|
|
PRBool mObserversEnabled;
|
2000-05-01 10:58:53 +04:00
|
|
|
nsString mCommandStr;
|
2001-02-07 02:35:29 +03:00
|
|
|
PRBool mParserEnabled;
|
2000-08-30 22:22:03 +04:00
|
|
|
nsTokenAllocator mTokenAllocator;
|
1999-09-22 10:19:50 +04:00
|
|
|
|
2001-06-21 06:06:23 +04:00
|
|
|
nsCOMPtr<nsIEventQueue> mEventQueue;
|
|
|
|
PRPackedBool mPendingContinueEvent;
|
|
|
|
PRPackedBool mCanInterrupt;
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
1999-11-12 00:35:34 +03:00
|
|
|
MOZ_TIMER_DECLARE(mParseTime)
|
|
|
|
MOZ_TIMER_DECLARE(mDTDTime)
|
|
|
|
MOZ_TIMER_DECLARE(mTokenizeTime)
|
1998-04-14 00:24:54 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|