|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #ifndef nsXBLContentSink_h__ |
|
7 #define nsXBLContentSink_h__ |
|
8 |
|
9 #include "mozilla/Attributes.h" |
|
10 #include "nsXMLContentSink.h" |
|
11 #include "nsXBLDocumentInfo.h" |
|
12 #include "nsXBLPrototypeHandler.h" |
|
13 #include "nsXBLProtoImpl.h" |
|
14 #include "nsLayoutCID.h" |
|
15 |
|
16 /* |
|
17 * Enum that describes the primary state of the parsing process |
|
18 */ |
|
19 typedef enum { |
|
20 eXBL_InDocument, /* outside any bindings */ |
|
21 eXBL_InBindings, /* Inside a <bindings> element */ |
|
22 eXBL_InBinding, /* Inside a <binding> */ |
|
23 eXBL_InResources, /* Inside a <resources> */ |
|
24 eXBL_InImplementation, /* Inside a <implementation> */ |
|
25 eXBL_InHandlers, /* Inside a <handlers> */ |
|
26 eXBL_Error /* An error has occurred. Suspend binding construction */ |
|
27 } XBLPrimaryState; |
|
28 |
|
29 /* |
|
30 * Enum that describes our substate (typically when parsing something |
|
31 * like <handlers> or <implementation>). |
|
32 */ |
|
33 typedef enum { |
|
34 eXBL_None, |
|
35 eXBL_InHandler, |
|
36 eXBL_InMethod, |
|
37 eXBL_InProperty, |
|
38 eXBL_InField, |
|
39 eXBL_InBody, |
|
40 eXBL_InGetter, |
|
41 eXBL_InSetter, |
|
42 eXBL_InConstructor, |
|
43 eXBL_InDestructor |
|
44 } XBLSecondaryState; |
|
45 |
|
46 class nsXULPrototypeElement; |
|
47 class nsXBLProtoImplMember; |
|
48 class nsXBLProtoImplProperty; |
|
49 class nsXBLProtoImplMethod; |
|
50 class nsXBLProtoImplField; |
|
51 class nsXBLPrototypeBinding; |
|
52 |
|
53 // The XBL content sink overrides the XML content sink to |
|
54 // builds its own lightweight data structures for the <resources>, |
|
55 // <handlers>, <implementation>, and |
|
56 |
|
57 class nsXBLContentSink : public nsXMLContentSink { |
|
58 public: |
|
59 nsXBLContentSink(); |
|
60 ~nsXBLContentSink(); |
|
61 |
|
62 NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW |
|
63 |
|
64 nsresult Init(nsIDocument* aDoc, |
|
65 nsIURI* aURL, |
|
66 nsISupports* aContainer); |
|
67 |
|
68 // nsIContentSink overrides |
|
69 NS_IMETHOD HandleStartElement(const char16_t *aName, |
|
70 const char16_t **aAtts, |
|
71 uint32_t aAttsCount, |
|
72 int32_t aIndex, |
|
73 uint32_t aLineNumber) MOZ_OVERRIDE; |
|
74 |
|
75 NS_IMETHOD HandleEndElement(const char16_t *aName) MOZ_OVERRIDE; |
|
76 |
|
77 NS_IMETHOD HandleCDataSection(const char16_t *aData, |
|
78 uint32_t aLength) MOZ_OVERRIDE; |
|
79 |
|
80 protected: |
|
81 // nsXMLContentSink overrides |
|
82 virtual void MaybeStartLayout(bool aIgnorePendingSheets) MOZ_OVERRIDE; |
|
83 |
|
84 bool OnOpenContainer(const char16_t **aAtts, |
|
85 uint32_t aAttsCount, |
|
86 int32_t aNameSpaceID, |
|
87 nsIAtom* aTagName, |
|
88 uint32_t aLineNumber) MOZ_OVERRIDE; |
|
89 |
|
90 bool NotifyForDocElement() MOZ_OVERRIDE { return false; } |
|
91 |
|
92 nsresult CreateElement(const char16_t** aAtts, uint32_t aAttsCount, |
|
93 nsINodeInfo* aNodeInfo, uint32_t aLineNumber, |
|
94 nsIContent** aResult, bool* aAppendContent, |
|
95 mozilla::dom::FromParser aFromParser) MOZ_OVERRIDE; |
|
96 |
|
97 nsresult AddAttributes(const char16_t** aAtts, |
|
98 nsIContent* aContent) MOZ_OVERRIDE; |
|
99 |
|
100 #ifdef MOZ_XUL |
|
101 nsresult AddAttributesToXULPrototype(const char16_t **aAtts, |
|
102 uint32_t aAttsCount, |
|
103 nsXULPrototypeElement* aElement); |
|
104 #endif |
|
105 |
|
106 // Our own helpers for constructing XBL prototype objects. |
|
107 nsresult ConstructBinding(uint32_t aLineNumber); |
|
108 void ConstructHandler(const char16_t **aAtts, uint32_t aLineNumber); |
|
109 void ConstructResource(const char16_t **aAtts, nsIAtom* aResourceType); |
|
110 void ConstructImplementation(const char16_t **aAtts); |
|
111 void ConstructProperty(const char16_t **aAtts, uint32_t aLineNumber); |
|
112 void ConstructMethod(const char16_t **aAtts); |
|
113 void ConstructParameter(const char16_t **aAtts); |
|
114 void ConstructField(const char16_t **aAtts, uint32_t aLineNumber); |
|
115 |
|
116 |
|
117 // nsXMLContentSink overrides |
|
118 nsresult FlushText(bool aReleaseTextNode = true) MOZ_OVERRIDE; |
|
119 |
|
120 // nsIExpatSink overrides |
|
121 NS_IMETHOD ReportError(const char16_t* aErrorText, |
|
122 const char16_t* aSourceText, |
|
123 nsIScriptError *aError, |
|
124 bool *_retval) MOZ_OVERRIDE; |
|
125 |
|
126 protected: |
|
127 nsresult ReportUnexpectedElement(nsIAtom* aElementName, uint32_t aLineNumber); |
|
128 |
|
129 void AddMember(nsXBLProtoImplMember* aMember); |
|
130 void AddField(nsXBLProtoImplField* aField); |
|
131 |
|
132 XBLPrimaryState mState; |
|
133 XBLSecondaryState mSecondaryState; |
|
134 nsXBLDocumentInfo* mDocInfo; |
|
135 bool mIsChromeOrResource; // For bug #45989 |
|
136 bool mFoundFirstBinding; |
|
137 |
|
138 nsString mCurrentBindingID; |
|
139 |
|
140 nsXBLPrototypeBinding* mBinding; |
|
141 nsXBLPrototypeHandler* mHandler; // current handler, owned by its PrototypeBinding |
|
142 nsXBLProtoImpl* mImplementation; |
|
143 nsXBLProtoImplMember* mImplMember; |
|
144 nsXBLProtoImplField* mImplField; |
|
145 nsXBLProtoImplProperty* mProperty; |
|
146 nsXBLProtoImplMethod* mMethod; |
|
147 nsXBLProtoImplField* mField; |
|
148 }; |
|
149 |
|
150 nsresult |
|
151 NS_NewXBLContentSink(nsIXMLContentSink** aResult, |
|
152 nsIDocument* aDoc, |
|
153 nsIURI* aURL, |
|
154 nsISupports* aContainer); |
|
155 #endif // nsXBLContentSink_h__ |