Line data Source code
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 "prenv.h"
11 : #include "nsIHTMLContentSink.h"
12 : #include "nsHTMLTokenizer.h"
13 : #include "nsMimeTypes.h"
14 : #include "nsHTMLTokenizer.h"
15 :
16 23 : CParserContext::CParserContext(CParserContext* aPrevContext,
17 : nsScanner* aScanner,
18 : void *aKey,
19 : eParserCommands aCommand,
20 : nsIRequestObserver* aListener,
21 : eAutoDetectResult aStatus,
22 23 : bool aCopyUnused)
23 : : mListener(aListener),
24 : mKey(aKey),
25 : mPrevContext(aPrevContext),
26 : mScanner(aScanner),
27 : mDTDMode(eDTDMode_unknown),
28 : mStreamListenerState(eNone),
29 : mContextType(eCTNone),
30 : mAutoDetectStatus(aStatus),
31 : mParserCommand(aCommand),
32 : mMultipart(true),
33 23 : mCopyUnused(aCopyUnused)
34 : {
35 23 : MOZ_COUNT_CTOR(CParserContext);
36 23 : }
37 :
38 44 : CParserContext::~CParserContext()
39 : {
40 : // It's ok to simply ingore the PrevContext.
41 22 : MOZ_COUNT_DTOR(CParserContext);
42 22 : }
43 :
44 : void
45 23 : CParserContext::SetMimeType(const nsACString& aMimeType)
46 : {
47 23 : mMimeType.Assign(aMimeType);
48 :
49 23 : mDocType = ePlainText;
50 :
51 23 : if (mMimeType.EqualsLiteral(TEXT_HTML))
52 1 : mDocType = eHTML_Strict;
53 65 : else if (mMimeType.EqualsLiteral(TEXT_XML) ||
54 42 : mMimeType.EqualsLiteral(APPLICATION_XML) ||
55 42 : mMimeType.EqualsLiteral(APPLICATION_XHTML_XML) ||
56 42 : mMimeType.EqualsLiteral(TEXT_XUL) ||
57 21 : mMimeType.EqualsLiteral(IMAGE_SVG_XML) ||
58 0 : mMimeType.EqualsLiteral(APPLICATION_MATHML_XML) ||
59 0 : mMimeType.EqualsLiteral(APPLICATION_RDF_XML) ||
60 22 : mMimeType.EqualsLiteral(APPLICATION_WAPXHTML_XML) ||
61 0 : mMimeType.EqualsLiteral(TEXT_RDF))
62 22 : mDocType = eXML;
63 23 : }
64 :
65 : nsresult
66 158 : CParserContext::GetTokenizer(nsIDTD* aDTD,
67 : nsIContentSink* aSink,
68 : nsITokenizer*& aTokenizer)
69 : {
70 158 : nsresult result = NS_OK;
71 158 : int32_t type = aDTD ? aDTD->GetType() : NS_IPARSER_FLAG_HTML;
72 :
73 158 : if (!mTokenizer) {
74 23 : if (type == NS_IPARSER_FLAG_HTML || mParserCommand == eViewSource) {
75 1 : mTokenizer = new nsHTMLTokenizer;
76 : }
77 22 : else if (type == NS_IPARSER_FLAG_XML) {
78 22 : mTokenizer = do_QueryInterface(aDTD, &result);
79 : }
80 : }
81 :
82 158 : aTokenizer = mTokenizer;
83 :
84 158 : return result;
85 : }
|