Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/parser/html/nsHtml5StringParser.cpp
Line
Count
Source (jump to first uncovered line)
1
/* This Source Code Form is subject to the terms of the Mozilla Public
2
 * License, v. 2.0. If a copy of the MPL was not distributed with this
3
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5
#include "nsHtml5StringParser.h"
6
#include "nsHtml5DependentUTF16Buffer.h"
7
#include "nsHtml5Tokenizer.h"
8
#include "nsHtml5TreeBuilder.h"
9
#include "nsHtml5TreeOpExecutor.h"
10
#include "nsIContent.h"
11
#include "nsIDocument.h"
12
#include "mozilla/dom/DocumentFragment.h"
13
14
NS_IMPL_ISUPPORTS0(nsHtml5StringParser)
15
16
nsHtml5StringParser::nsHtml5StringParser()
17
  : mBuilder(new nsHtml5OplessBuilder())
18
  , mTreeBuilder(new nsHtml5TreeBuilder(mBuilder))
19
  , mTokenizer(new nsHtml5Tokenizer(mTreeBuilder, false))
20
0
{
21
0
  mTokenizer->setInterner(&mAtomTable);
22
0
}
23
24
0
nsHtml5StringParser::~nsHtml5StringParser() {}
25
26
nsresult
27
nsHtml5StringParser::ParseFragment(const nsAString& aSourceBuffer,
28
                                   nsIContent* aTargetNode,
29
                                   nsAtom* aContextLocalName,
30
                                   int32_t aContextNamespace,
31
                                   bool aQuirks,
32
                                   bool aPreventScriptExecution)
33
0
{
34
0
  NS_ENSURE_TRUE(aSourceBuffer.Length() <= INT32_MAX, NS_ERROR_OUT_OF_MEMORY);
35
0
36
0
  nsIDocument* doc = aTargetNode->OwnerDoc();
37
0
  nsIURI* uri = doc->GetDocumentURI();
38
0
  NS_ENSURE_TRUE(uri, NS_ERROR_NOT_AVAILABLE);
39
0
40
0
  mTreeBuilder->setFragmentContext(
41
0
    aContextLocalName, aContextNamespace, aTargetNode, aQuirks);
42
0
43
#ifdef DEBUG
44
  if (!aPreventScriptExecution) {
45
    NS_ASSERTION(!aTargetNode->IsInUncomposedDoc(),
46
                 "If script execution isn't prevented, "
47
                 "the target node must not be in doc.");
48
    NS_ASSERTION(
49
      aTargetNode->NodeType() == nsINode::DOCUMENT_FRAGMENT_NODE,
50
      "If script execution isn't prevented, must parse to DOM fragment.");
51
  }
52
#endif
53
54
0
  mTreeBuilder->SetPreventScriptExecution(aPreventScriptExecution);
55
0
56
0
  return Tokenize(aSourceBuffer, doc, true);
57
0
}
58
59
nsresult
60
nsHtml5StringParser::ParseDocument(const nsAString& aSourceBuffer,
61
                                   nsIDocument* aTargetDoc,
62
                                   bool aScriptingEnabledForNoscriptParsing)
63
0
{
64
0
  MOZ_ASSERT(!aTargetDoc->GetFirstChild());
65
0
66
0
  NS_ENSURE_TRUE(aSourceBuffer.Length() <= INT32_MAX, NS_ERROR_OUT_OF_MEMORY);
67
0
68
0
  mTreeBuilder->setFragmentContext(nullptr, kNameSpaceID_None, nullptr, false);
69
0
70
0
  mTreeBuilder->SetPreventScriptExecution(true);
71
0
72
0
  return Tokenize(
73
0
    aSourceBuffer, aTargetDoc, aScriptingEnabledForNoscriptParsing);
74
0
}
75
76
nsresult
77
nsHtml5StringParser::Tokenize(const nsAString& aSourceBuffer,
78
                              nsIDocument* aDocument,
79
                              bool aScriptingEnabledForNoscriptParsing)
80
0
{
81
0
82
0
  nsIURI* uri = aDocument->GetDocumentURI();
83
0
84
0
  mBuilder->Init(aDocument, uri, nullptr, nullptr);
85
0
86
0
  mBuilder->SetParser(this);
87
0
  mBuilder->SetNodeInfoManager(aDocument->NodeInfoManager());
88
0
89
0
  // Mark the parser as *not* broken by passing NS_OK
90
0
  nsresult rv = mBuilder->MarkAsBroken(NS_OK);
91
0
92
0
  mTreeBuilder->setScriptingEnabled(aScriptingEnabledForNoscriptParsing);
93
0
  mTreeBuilder->setIsSrcdocDocument(aDocument->IsSrcdocDocument());
94
0
  mBuilder->Start();
95
0
  mTokenizer->start();
96
0
  if (!aSourceBuffer.IsEmpty()) {
97
0
    bool lastWasCR = false;
98
0
    nsHtml5DependentUTF16Buffer buffer(aSourceBuffer);
99
0
    while (buffer.hasMore()) {
100
0
      buffer.adjust(lastWasCR);
101
0
      lastWasCR = false;
102
0
      if (buffer.hasMore()) {
103
0
        if (!mTokenizer->EnsureBufferSpace(buffer.getLength())) {
104
0
          rv = mBuilder->MarkAsBroken(NS_ERROR_OUT_OF_MEMORY);
105
0
          break;
106
0
        }
107
0
        lastWasCR = mTokenizer->tokenizeBuffer(&buffer);
108
0
        if (NS_FAILED(rv = mBuilder->IsBroken())) {
109
0
          break;
110
0
        }
111
0
      }
112
0
    }
113
0
  }
114
0
  if (NS_SUCCEEDED(rv)) {
115
0
    mTokenizer->eof();
116
0
  }
117
0
  mTokenizer->end();
118
0
  mBuilder->Finish();
119
0
  mAtomTable.Clear();
120
0
  return rv;
121
0
}