|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim: set ts=2 sw=2 et tw=80: */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 |
|
8 #include "nsIAtom.h" |
|
9 #include "CParserContext.h" |
|
10 #include "nsToken.h" |
|
11 #include "prenv.h" |
|
12 #include "nsIHTMLContentSink.h" |
|
13 #include "nsHTMLTokenizer.h" |
|
14 #include "nsMimeTypes.h" |
|
15 #include "nsHTMLTokenizer.h" |
|
16 |
|
17 CParserContext::CParserContext(CParserContext* aPrevContext, |
|
18 nsScanner* aScanner, |
|
19 void *aKey, |
|
20 eParserCommands aCommand, |
|
21 nsIRequestObserver* aListener, |
|
22 eAutoDetectResult aStatus, |
|
23 bool aCopyUnused) |
|
24 : mListener(aListener), |
|
25 mKey(aKey), |
|
26 mPrevContext(aPrevContext), |
|
27 mScanner(aScanner), |
|
28 mDTDMode(eDTDMode_unknown), |
|
29 mStreamListenerState(eNone), |
|
30 mContextType(eCTNone), |
|
31 mAutoDetectStatus(aStatus), |
|
32 mParserCommand(aCommand), |
|
33 mMultipart(true), |
|
34 mCopyUnused(aCopyUnused) |
|
35 { |
|
36 MOZ_COUNT_CTOR(CParserContext); |
|
37 } |
|
38 |
|
39 CParserContext::~CParserContext() |
|
40 { |
|
41 // It's ok to simply ingore the PrevContext. |
|
42 MOZ_COUNT_DTOR(CParserContext); |
|
43 } |
|
44 |
|
45 void |
|
46 CParserContext::SetMimeType(const nsACString& aMimeType) |
|
47 { |
|
48 mMimeType.Assign(aMimeType); |
|
49 |
|
50 mDocType = ePlainText; |
|
51 |
|
52 if (mMimeType.EqualsLiteral(TEXT_HTML)) |
|
53 mDocType = eHTML_Strict; |
|
54 else if (mMimeType.EqualsLiteral(TEXT_XML) || |
|
55 mMimeType.EqualsLiteral(APPLICATION_XML) || |
|
56 mMimeType.EqualsLiteral(APPLICATION_XHTML_XML) || |
|
57 mMimeType.EqualsLiteral(TEXT_XUL) || |
|
58 mMimeType.EqualsLiteral(IMAGE_SVG_XML) || |
|
59 mMimeType.EqualsLiteral(APPLICATION_MATHML_XML) || |
|
60 mMimeType.EqualsLiteral(APPLICATION_RDF_XML) || |
|
61 mMimeType.EqualsLiteral(TEXT_RDF)) |
|
62 mDocType = eXML; |
|
63 } |
|
64 |
|
65 nsresult |
|
66 CParserContext::GetTokenizer(nsIDTD* aDTD, |
|
67 nsIContentSink* aSink, |
|
68 nsITokenizer*& aTokenizer) |
|
69 { |
|
70 nsresult result = NS_OK; |
|
71 int32_t type = aDTD ? aDTD->GetType() : NS_IPARSER_FLAG_HTML; |
|
72 |
|
73 if (!mTokenizer) { |
|
74 if (type == NS_IPARSER_FLAG_HTML || mParserCommand == eViewSource) { |
|
75 mTokenizer = new nsHTMLTokenizer; |
|
76 } |
|
77 else if (type == NS_IPARSER_FLAG_XML) { |
|
78 mTokenizer = do_QueryInterface(aDTD, &result); |
|
79 } |
|
80 } |
|
81 |
|
82 aTokenizer = mTokenizer; |
|
83 |
|
84 return result; |
|
85 } |