summaryrefslogtreecommitdiffstats
path: root/parser/html/nsHtml5StringParser.h
blob: 8b0203301dc5e2ca19297346d06e81e606ae9f60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef nsHtml5StringParser_h
#define nsHtml5StringParser_h

#include "mozilla/UniquePtr.h"
#include "nsHtml5AtomTable.h"
#include "nsParserBase.h"

class nsHtml5OplessBuilder;
class nsHtml5TreeBuilder;
class nsHtml5Tokenizer;
class nsIContent;
namespace mozilla {
namespace dom {
class Document;
}
}  // namespace mozilla

class nsHtml5StringParser : public nsParserBase {
 public:
  NS_DECL_ISUPPORTS

  /**
   * Constructor for use ONLY by nsContentUtils. Others, please call the
   * nsContentUtils statics that wrap this.
   */
  nsHtml5StringParser();

  /**
   * Invoke the fragment parsing algorithm (innerHTML).
   * DO NOT CALL from outside nsContentUtils.cpp.
   *
   * @param aSourceBuffer the string being set as innerHTML
   * @param aTargetNode the target container
   * @param aContextLocalName local name of context node
   * @param aContextNamespace namespace of context node
   * @param aQuirks true to make <table> not close <p>
   * @param aPreventScriptExecution true to prevent scripts from executing;
   * don't set to false when parsing into a target node that has been bound
   * to tree.
   * @param aAllowDeclarativeShadowRoots allow the creation of declarative
   * shadow roots.
   */
  nsresult ParseFragment(const nsAString& aSourceBuffer,
                         nsIContent* aTargetNode, nsAtom* aContextLocalName,
                         int32_t aContextNamespace, bool aQuirks,
                         bool aPreventScriptExecution,
                         bool aAllowDeclarativeShadowRoots);

  /**
   * Parse an entire HTML document from a source string.
   * DO NOT CALL from outside nsContentUtils.cpp.
   *
   */
  nsresult ParseDocument(const nsAString& aSourceBuffer,
                         mozilla::dom::Document* aTargetDoc,
                         bool aScriptingEnabledForNoscriptParsing);

 private:
  virtual ~nsHtml5StringParser();

  nsresult Tokenize(const nsAString& aSourceBuffer,
                    mozilla::dom::Document* aDocument,
                    bool aScriptingEnabledForNoscriptParsing,
                    bool aDeclarativeShadowRootsAllowed);

  void TryCache();
  void ClearCaches();

  /**
   * The tree operation executor
   */
  RefPtr<nsHtml5OplessBuilder> mBuilder;

  /**
   * The HTML5 tree builder
   */
  const mozilla::UniquePtr<nsHtml5TreeBuilder> mTreeBuilder;

  /**
   * The HTML5 tokenizer
   */
  const mozilla::UniquePtr<nsHtml5Tokenizer> mTokenizer;

  /**
   * The scoped atom table
   */
  nsHtml5AtomTable mAtomTable;

  class CacheClearer : public mozilla::Runnable {
   public:
    explicit CacheClearer(nsHtml5StringParser* aParser)
        : Runnable("CacheClearer"), mParser(aParser) {}
    NS_IMETHOD Run() {
      if (mParser) {
        mParser->ClearCaches();
      }
      return NS_OK;
    }
    void Disconnect() { mParser = nullptr; }

   private:
    nsHtml5StringParser* mParser;
  };

  RefPtr<CacheClearer> mCacheClearer;
};

#endif  // nsHtml5StringParser_h