/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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 https://mozilla.org/MPL/2.0/. */ #ifndef mozilla_parser_PrototypeDocumentParser_h #define mozilla_parser_PrototypeDocumentParser_h #include "nsCycleCollectionParticipant.h" #include "nsIContentSink.h" #include "nsIParser.h" #include "nsXULPrototypeDocument.h" class nsIExpatSink; namespace mozilla { namespace dom { class PrototypeDocumentContentSink; } // namespace dom } // namespace mozilla namespace mozilla { namespace parser { // The PrototypeDocumentParser is more of a stub than a real parser. It is // responsible for loading an nsXULPrototypeDocument either from the startup // cache or creating a new prototype from the original source if a cached // version does not exist. Once the parser finishes loading the prototype it // will notify the content sink. class PrototypeDocumentParser final : public nsIParser, public nsIStreamListener { public: NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(PrototypeDocumentParser, nsIParser) explicit PrototypeDocumentParser(nsIURI* aDocumentURI, dom::Document* aDocument); NS_DECL_NSIREQUESTOBSERVER NS_DECL_NSISTREAMLISTENER // Start nsIParser // Ideally, this would just implement nsBaseParser since most of these are // stubs, but Document.h expects an nsIParser. NS_IMETHOD_(void) SetContentSink(nsIContentSink* aSink) override; NS_IMETHOD_(nsIContentSink*) GetContentSink() override; NS_IMETHOD_(void) GetCommand(nsCString& aCommand) override {} NS_IMETHOD_(void) SetCommand(const char* aCommand) override {} NS_IMETHOD_(void) SetCommand(eParserCommands aParserCommand) override {} virtual void SetDocumentCharset(NotNull aEncoding, int32_t aSource) override {} NS_IMETHOD GetChannel(nsIChannel** aChannel) override { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHOD GetDTD(nsIDTD** aDTD) override { return NS_ERROR_NOT_IMPLEMENTED; } virtual nsIStreamListener* GetStreamListener() override; NS_IMETHOD ContinueInterruptedParsing() override { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHOD_(void) BlockParser() override {} NS_IMETHOD_(void) UnblockParser() override {} NS_IMETHOD_(void) ContinueInterruptedParsingAsync() override {} NS_IMETHOD_(bool) IsParserEnabled() override { return true; } NS_IMETHOD_(bool) IsComplete() override; NS_IMETHOD Parse(nsIURI* aURL, nsIRequestObserver* aListener = nullptr, void* aKey = 0, nsDTDMode aMode = eDTDMode_autodetect) override; NS_IMETHOD Terminate() override { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHOD ParseFragment(const nsAString& aSourceBuffer, nsTArray& aTagStack) override { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHOD BuildModel() override { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHOD CancelParsingEvents() override { return NS_ERROR_NOT_IMPLEMENTED; } virtual void Reset() override {} virtual bool IsInsertionPointDefined() override { return false; } void IncrementScriptNestingLevel() final {} void DecrementScriptNestingLevel() final {} bool HasNonzeroScriptNestingLevel() const final { return false; } virtual void MarkAsNotScriptCreated(const char* aCommand) override {} virtual bool IsScriptCreated() override { return false; } // End nsIParser private: virtual ~PrototypeDocumentParser(); protected: nsresult PrepareToLoadPrototype(nsIURI* aURI, nsIPrincipal* aDocumentPrincipal, nsIParser** aResult); // This is invoked whenever the prototype for this document is loaded // and should be walked, regardless of whether the XUL cache is // disabled, whether the protototype was loaded, whether the // prototype was loaded from the cache or created by parsing the // actual XUL source, etc. nsresult OnPrototypeLoadDone(); nsCOMPtr mDocumentURI; RefPtr mOriginalSink; RefPtr mDocument; // The XML parser that data is forwarded to when the prototype does not exist // and must be parsed from disk. nsCOMPtr mStreamListener; // The current prototype that we are walking to construct the // content model. RefPtr mCurrentPrototype; // True if there was a prototype in the cache and it finished loading // already. bool mPrototypeAlreadyLoaded; // True after the parser has notified the content sink that it is done. bool mIsComplete; }; } // namespace parser } // namespace mozilla #endif // mozilla_parser_PrototypeDocumentParser_h