content/html/document/src/nsHTMLDocument.h

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:37916b268d99
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 #ifndef nsHTMLDocument_h___
7 #define nsHTMLDocument_h___
8
9 #include "mozilla/Attributes.h"
10 #include "nsDocument.h"
11 #include "nsIHTMLDocument.h"
12 #include "nsIDOMHTMLDocument.h"
13 #include "nsIDOMHTMLCollection.h"
14 #include "nsIScriptElement.h"
15 #include "nsTArray.h"
16
17 #include "pldhash.h"
18 #include "nsIHttpChannel.h"
19 #include "nsHTMLStyleSheet.h"
20
21 #include "nsICommandManager.h"
22 #include "mozilla/dom/HTMLSharedElement.h"
23
24 class nsIEditor;
25 class nsIParser;
26 class nsIURI;
27 class nsIMarkupDocumentViewer;
28 class nsIDocShell;
29 class nsICachingChannel;
30 class nsIWyciwygChannel;
31 class nsILoadGroup;
32
33 namespace mozilla {
34 namespace dom {
35 class HTMLAllCollection;
36 } // namespace dom
37 } // namespace mozilla
38
39 class nsHTMLDocument : public nsDocument,
40 public nsIHTMLDocument,
41 public nsIDOMHTMLDocument
42 {
43 public:
44 using nsDocument::SetDocumentURI;
45 using nsDocument::GetPlugins;
46
47 nsHTMLDocument();
48 ~nsHTMLDocument();
49 virtual nsresult Init() MOZ_OVERRIDE;
50
51 NS_DECL_ISUPPORTS_INHERITED
52 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsHTMLDocument, nsDocument)
53
54 // nsIDocument
55 virtual void Reset(nsIChannel* aChannel, nsILoadGroup* aLoadGroup) MOZ_OVERRIDE;
56 virtual void ResetToURI(nsIURI* aURI, nsILoadGroup* aLoadGroup,
57 nsIPrincipal* aPrincipal) MOZ_OVERRIDE;
58
59 virtual already_AddRefed<nsIPresShell> CreateShell(nsPresContext* aContext,
60 nsViewManager* aViewManager,
61 nsStyleSet* aStyleSet) MOZ_OVERRIDE;
62
63 virtual nsresult StartDocumentLoad(const char* aCommand,
64 nsIChannel* aChannel,
65 nsILoadGroup* aLoadGroup,
66 nsISupports* aContainer,
67 nsIStreamListener **aDocListener,
68 bool aReset = true,
69 nsIContentSink* aSink = nullptr) MOZ_OVERRIDE;
70 virtual void StopDocumentLoad() MOZ_OVERRIDE;
71
72 virtual void BeginLoad() MOZ_OVERRIDE;
73 virtual void EndLoad() MOZ_OVERRIDE;
74
75 // nsIHTMLDocument
76 virtual void SetCompatibilityMode(nsCompatibility aMode) MOZ_OVERRIDE;
77
78 virtual bool IsWriting() MOZ_OVERRIDE
79 {
80 return mWriteLevel != uint32_t(0);
81 }
82
83 virtual NS_HIDDEN_(nsContentList*) GetForms();
84
85 virtual NS_HIDDEN_(nsContentList*) GetFormControls();
86
87 // nsIDOMDocument interface
88 using nsDocument::CreateElement;
89 using nsDocument::CreateElementNS;
90 NS_FORWARD_NSIDOMDOCUMENT(nsDocument::)
91
92 // And explicitly import the things from nsDocument that we just shadowed
93 using nsDocument::GetImplementation;
94 using nsDocument::GetTitle;
95 using nsDocument::SetTitle;
96 using nsDocument::GetLastStyleSheetSet;
97 using nsDocument::MozSetImageElement;
98 using nsDocument::GetMozFullScreenElement;
99
100 // nsIDOMNode interface
101 NS_FORWARD_NSIDOMNODE_TO_NSINODE
102
103 // nsIDOMHTMLDocument interface
104 NS_DECL_NSIDOMHTMLDOCUMENT
105
106 mozilla::dom::HTMLAllCollection* All();
107 void GetAll(JSContext* aCx, JS::MutableHandle<JSObject*> aRetval,
108 mozilla::ErrorResult& aRv);
109
110 nsISupports* ResolveName(const nsAString& aName, nsWrapperCache **aCache);
111
112 virtual void AddedForm() MOZ_OVERRIDE;
113 virtual void RemovedForm() MOZ_OVERRIDE;
114 virtual int32_t GetNumFormsSynchronous() MOZ_OVERRIDE;
115 virtual void TearingDownEditor(nsIEditor *aEditor) MOZ_OVERRIDE;
116 virtual void SetIsXHTML(bool aXHTML) MOZ_OVERRIDE { mIsRegularHTML = !aXHTML; }
117 virtual void SetDocWriteDisabled(bool aDisabled) MOZ_OVERRIDE
118 {
119 mDisableDocWrite = aDisabled;
120 }
121
122 nsresult ChangeContentEditableCount(nsIContent *aElement, int32_t aChange) MOZ_OVERRIDE;
123 void DeferredContentEditableCountChange(nsIContent *aElement);
124
125 virtual EditingState GetEditingState() MOZ_OVERRIDE
126 {
127 return mEditingState;
128 }
129
130 virtual void DisableCookieAccess() MOZ_OVERRIDE
131 {
132 mDisableCookieAccess = true;
133 }
134
135 class nsAutoEditingState {
136 public:
137 nsAutoEditingState(nsHTMLDocument* aDoc, EditingState aState)
138 : mDoc(aDoc), mSavedState(aDoc->mEditingState)
139 {
140 aDoc->mEditingState = aState;
141 }
142 ~nsAutoEditingState() {
143 mDoc->mEditingState = mSavedState;
144 }
145 private:
146 nsHTMLDocument* mDoc;
147 EditingState mSavedState;
148 };
149 friend class nsAutoEditingState;
150
151 void EndUpdate(nsUpdateType aUpdateType) MOZ_OVERRIDE;
152
153 virtual nsresult SetEditingState(EditingState aState) MOZ_OVERRIDE;
154
155 virtual nsresult Clone(nsINodeInfo *aNodeInfo, nsINode **aResult) const MOZ_OVERRIDE;
156
157 virtual NS_HIDDEN_(void) RemovedFromDocShell() MOZ_OVERRIDE;
158
159 virtual mozilla::dom::Element *GetElementById(const nsAString& aElementId)
160 {
161 return nsDocument::GetElementById(aElementId);
162 }
163
164 virtual void DocAddSizeOfExcludingThis(nsWindowSizes* aWindowSizes) const MOZ_OVERRIDE;
165 // DocAddSizeOfIncludingThis is inherited from nsIDocument.
166
167 virtual bool WillIgnoreCharsetOverride() MOZ_OVERRIDE;
168
169 // WebIDL API
170 virtual JSObject* WrapNode(JSContext* aCx)
171 MOZ_OVERRIDE;
172 void GetDomain(nsAString& aDomain, mozilla::ErrorResult& rv);
173 void SetDomain(const nsAString& aDomain, mozilla::ErrorResult& rv);
174 void GetCookie(nsAString& aCookie, mozilla::ErrorResult& rv);
175 void SetCookie(const nsAString& aCookie, mozilla::ErrorResult& rv);
176 void NamedGetter(JSContext* cx, const nsAString& aName, bool& aFound,
177 JS::MutableHandle<JSObject*> aRetval,
178 mozilla::ErrorResult& rv);
179 bool NameIsEnumerable(const nsAString& aName);
180 void GetSupportedNames(unsigned, nsTArray<nsString>& aNames);
181 nsGenericHTMLElement *GetBody();
182 void SetBody(nsGenericHTMLElement* aBody, mozilla::ErrorResult& rv);
183 mozilla::dom::HTMLSharedElement *GetHead() {
184 return static_cast<mozilla::dom::HTMLSharedElement*>(GetHeadElement());
185 }
186 nsIHTMLCollection* Images();
187 nsIHTMLCollection* Embeds();
188 nsIHTMLCollection* Plugins();
189 nsIHTMLCollection* Links();
190 nsIHTMLCollection* Forms()
191 {
192 return nsHTMLDocument::GetForms();
193 }
194 nsIHTMLCollection* Scripts();
195 already_AddRefed<nsContentList> GetElementsByName(const nsAString & aName)
196 {
197 return NS_GetFuncStringNodeList(this, MatchNameAttribute, nullptr,
198 UseExistingNameString, aName);
199 }
200 already_AddRefed<nsINodeList> GetItems(const nsAString& aTypeNames);
201 already_AddRefed<nsIDocument> Open(JSContext* cx,
202 const nsAString& aType,
203 const nsAString& aReplace,
204 mozilla::ErrorResult& rv);
205 already_AddRefed<nsIDOMWindow> Open(JSContext* cx,
206 const nsAString& aURL,
207 const nsAString& aName,
208 const nsAString& aFeatures,
209 bool aReplace,
210 mozilla::ErrorResult& rv);
211 void Close(mozilla::ErrorResult& rv);
212 void Write(JSContext* cx, const mozilla::dom::Sequence<nsString>& aText,
213 mozilla::ErrorResult& rv);
214 void Writeln(JSContext* cx, const mozilla::dom::Sequence<nsString>& aText,
215 mozilla::ErrorResult& rv);
216 // The XPCOM GetDesignMode() works OK for us, since it never throws.
217 void SetDesignMode(const nsAString& aDesignMode, mozilla::ErrorResult& rv);
218 bool ExecCommand(const nsAString& aCommandID, bool aDoShowUI,
219 const nsAString& aValue, mozilla::ErrorResult& rv);
220 bool QueryCommandEnabled(const nsAString& aCommandID,
221 mozilla::ErrorResult& rv);
222 bool QueryCommandIndeterm(const nsAString& aCommandID,
223 mozilla::ErrorResult& rv);
224 bool QueryCommandState(const nsAString& aCommandID, mozilla::ErrorResult& rv);
225 bool QueryCommandSupported(const nsAString& aCommandID);
226 void QueryCommandValue(const nsAString& aCommandID, nsAString& aValue,
227 mozilla::ErrorResult& rv);
228 // The XPCOM Get/SetFgColor work OK for us, since they never throw.
229 // The XPCOM Get/SetLinkColor work OK for us, since they never throw.
230 // The XPCOM Get/SetVLinkColor work OK for us, since they never throw.
231 // The XPCOM Get/SetALinkColor work OK for us, since they never throw.
232 // The XPCOM Get/SetBgColor work OK for us, since they never throw.
233 nsIHTMLCollection* Anchors();
234 nsIHTMLCollection* Applets();
235 void Clear() const
236 {
237 // Deprecated
238 }
239 mozilla::dom::Selection* GetSelection(mozilla::ErrorResult& aRv);
240 // The XPCOM CaptureEvents works fine for us.
241 // The XPCOM ReleaseEvents works fine for us.
242 // We're picking up GetLocation from Document
243 already_AddRefed<nsIDOMLocation> GetLocation() const {
244 return nsIDocument::GetLocation();
245 }
246
247 virtual nsHTMLDocument* AsHTMLDocument() MOZ_OVERRIDE { return this; }
248
249 protected:
250 nsresult GetBodySize(int32_t* aWidth,
251 int32_t* aHeight);
252
253 nsIContent *MatchId(nsIContent *aContent, const nsAString& aId);
254
255 static bool MatchLinks(nsIContent *aContent, int32_t aNamespaceID,
256 nsIAtom* aAtom, void* aData);
257 static bool MatchAnchors(nsIContent *aContent, int32_t aNamespaceID,
258 nsIAtom* aAtom, void* aData);
259 static bool MatchNameAttribute(nsIContent* aContent, int32_t aNamespaceID,
260 nsIAtom* aAtom, void* aData);
261 static void* UseExistingNameString(nsINode* aRootNode, const nsString* aName);
262
263 static void DocumentWriteTerminationFunc(nsISupports *aRef);
264
265 already_AddRefed<nsIURI> GetDomainURI();
266
267 nsresult WriteCommon(JSContext *cx, const nsAString& aText,
268 bool aNewlineTerminate);
269 // A version of WriteCommon used by WebIDL bindings
270 void WriteCommon(JSContext *cx,
271 const mozilla::dom::Sequence<nsString>& aText,
272 bool aNewlineTerminate,
273 mozilla::ErrorResult& rv);
274
275 nsresult CreateAndAddWyciwygChannel(void);
276 nsresult RemoveWyciwygChannel(void);
277
278 /**
279 * Like IsEditingOn(), but will flush as needed first.
280 */
281 bool IsEditingOnAfterFlush();
282
283 void *GenerateParserKey(void);
284
285 nsRefPtr<nsContentList> mImages;
286 nsRefPtr<nsContentList> mApplets;
287 nsRefPtr<nsContentList> mEmbeds;
288 nsRefPtr<nsContentList> mLinks;
289 nsRefPtr<nsContentList> mAnchors;
290 nsRefPtr<nsContentList> mScripts;
291 nsRefPtr<nsContentList> mForms;
292 nsRefPtr<nsContentList> mFormControls;
293
294 nsRefPtr<mozilla::dom::HTMLAllCollection> mAll;
295
296 /** # of forms in the document, synchronously set */
297 int32_t mNumForms;
298
299 static uint32_t gWyciwygSessionCnt;
300
301 static void TryHintCharset(nsIMarkupDocumentViewer* aMarkupDV,
302 int32_t& aCharsetSource,
303 nsACString& aCharset);
304 void TryUserForcedCharset(nsIMarkupDocumentViewer* aMarkupDV,
305 nsIDocShell* aDocShell,
306 int32_t& aCharsetSource,
307 nsACString& aCharset);
308 static void TryCacheCharset(nsICachingChannel* aCachingChannel,
309 int32_t& aCharsetSource,
310 nsACString& aCharset);
311 void TryParentCharset(nsIDocShell* aDocShell,
312 int32_t& charsetSource, nsACString& aCharset);
313 void TryTLD(int32_t& aCharsetSource, nsACString& aCharset);
314 static void TryFallback(int32_t& aCharsetSource, nsACString& aCharset);
315
316 // Override so we can munge the charset on our wyciwyg channel as needed.
317 virtual void SetDocumentCharacterSet(const nsACString& aCharSetID) MOZ_OVERRIDE;
318
319 // Tracks if we are currently processing any document.write calls (either
320 // implicit or explicit). Note that if a write call writes out something which
321 // would block the parser, then mWriteLevel will be incorrect until the parser
322 // finishes processing that script.
323 uint32_t mWriteLevel;
324
325 // Load flags of the document's channel
326 uint32_t mLoadFlags;
327
328 bool mTooDeepWriteRecursion;
329
330 bool mDisableDocWrite;
331
332 bool mWarnedWidthHeight;
333
334 nsCOMPtr<nsIWyciwygChannel> mWyciwygChannel;
335
336 /* Midas implementation */
337 nsresult GetMidasCommandManager(nsICommandManager** aCommandManager);
338
339 nsCOMPtr<nsICommandManager> mMidasCommandManager;
340
341 nsresult TurnEditingOff();
342 nsresult EditingStateChanged();
343 void MaybeEditingStateChanged();
344
345 uint32_t mContentEditableCount;
346 EditingState mEditingState;
347
348 // When false, the .cookies property is completely disabled
349 bool mDisableCookieAccess;
350
351 /**
352 * Temporary flag that is set in EndUpdate() to ignore
353 * MaybeEditingStateChanged() script runners from a nested scope.
354 */
355 bool mPendingMaybeEditingStateChanged;
356 };
357
358 #define NS_HTML_DOCUMENT_INTERFACE_TABLE_BEGIN(_class) \
359 NS_DOCUMENT_INTERFACE_TABLE_BEGIN(_class) \
360 NS_INTERFACE_TABLE_ENTRY(_class, nsIHTMLDocument) \
361 NS_INTERFACE_TABLE_ENTRY(_class, nsIDOMHTMLDocument)
362
363 #endif /* nsHTMLDocument_h___ */

mercurial