Files
roytam1 15db8f16bf import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1132854 - Remove the gfx::ToIntSize conversion helper. r=Bas (0ee451e53)
- Bug 1020179 - Let PContent manage PContentPermissionRequest. r=fabrice, r=khuey (caf96b54e)
- Bug 1153023 - Convert TabParent::mChromeOffset to a LayoutDeviceIntPoint. r=billm (ba338584a)
- Bug 1139033 - Don't schedule an unnecessary repeat transaction when doing a non-progressive paint. r=nical (9c77d9318)
- Bug 1137203 - Ignore the critical displayport when a layer is subject to OMTA relative to the scrolling ancestor. r=BenWa (c9bedfb1e)
- Bug 1137203 - Cleanup to ditch the fast-path code entirely and just prevent progressive drawing in the equivalent scenarios. r=BenWa (6bc5b8813)
- Bug 1128042 - Don't round critical displayport out as it should already be tile aligned and rounding error can increase tile usage. r=botond (03e34e2c5)
- Bug 1149461 - Disable progressive drawing unless the compositor is actively scrolling a tiled layer. r=nical (7a3de28cb)
- Bug 1152838 - Correctly inflate valid regions to tile boundaries. r=mattwoodrow (7a496f645)
- Bug 1148971 - Make nsITheme::GetMinimumWidgetSize return a LayoutDeviceIntSize result instead of the unit-less nsIntSize type. r=roc (c34ddc478)
- Bug 1155621 - Make nsIntRect and nsIntPoint typedefs of mozilla::gfx::IntRect and mozilla::gfx::IntPoint. r=Bas (9901a37f6)
- Bug 1156632 - Remove unused forward class declarations - patch 5 - rdf, parser, layout and something else, r=ehsan (794739bd3)
- Bug 1156632 - Remove unused forward class declarations - patch 6 - the rest of the tree, r=ehsan (63a2c4cb4)
- Bug 1161634 - Allow synthesizing native mouse-scroll events on Linux. r=karlt (b88c1f367)
- Bug 1161634 - Enable the test_wheel_scroll on Linux as well. r=mstange (7dab62ad4)
- Bug 1144643 - Render tooltips as transparent on Gtk3. r=karlt (80f7fa312)
- Bug 1174966 part 1 - Change type of mCancelledPointerLockRequests field from uint32_t to bit field. r=smaug (ef235c33e)
- Bug 1155030 - Fix asterix/asterisk misspelling. r=ehsan (edb769304)
- Bug 1149194 - Don't use uninitialized value in ComputedTimingFunction::operator==. r=bbirtles (6bc804d45)
- Bug 1151346 - Make ActiveLayerTracker::IsOffsetOrMarginStyleAnimated respect CSS animations. r=roc (2c3f24ba0)
- Bug 1151346 - Back out the important part again because of bug 1151889. (002b0e67b)
- Bug 1122414 part 1 - Factor out a TransitionProperty method in ElementPropertyTransition; r=jwatt (ddbbdb04c)
- Bug 1122414 part 2 - Return the transitionProperty from Animation.name for CSS transitions; r=jwatt (689251b93)
- Bug 1122414 part 3 - Update DevTools tests to expect a name for transitions; r=pbrosset (f0d7e57e9)
- Bug 1149999 - 1 - Display transition names in animation-panel now that they have names; r=past (ea3d8d552)
- Bug 1120343 - 1 - Allow setting animations' currentTime by clicking/dragging the timeline; r=miker (936996d21)
- Bug 1120343 - 2 - Add rewind and fast-forward buttons to animation player widgets; r=miker (95eddc465)
- Bug 1120343 - 3 - Tests for the current time control in the animation panel; r=miker (b8a93f858)
- Bug 1110762 - Add a setCurrentTime method to the animation actor; r=past (d0dae8967)
- Bug 1123851 - 1 - Element geometry highlighter; r=bgrins (89b1a83bf)
- Bug 1123851 - 2 - Tests for the element geometry highlighter; r=bgrins (7542bcab0)
- add missing part of accessing first element from Bug 1139925 - Make the BoxModelHighlighter highlight all quads (b5c6076c1)
- Bug 1139186 - 1 - Refactor to the native anon nodes manipulation in highlighters; r=bgrins (a454aefbf)
- Bug 1139186 - 2 - Add event handling support to CanvasFrameAnonymousContentHelper; r=bgrins (a705c2716)
- Bug 1120339 - Add setPlaybackRate method to AnimationPlayerActor; r=past (efa167a19)
- Bug 1120833 - 2 - Fire events about changed animations in the AnimationsActor; r=past (4b5fddd23)
- Bug 1120833 - 1 - Remove EventEmitter usage in AnimationPlayerFront (21186e616)
2020-05-30 12:49:11 +08:00

399 lines
12 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* 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/. */
/**
* MODULE NOTES:
*
* This class does two primary jobs:
* 1) It iterates the tokens provided during the
* tokenization process, identifing where elements
* begin and end (doing validation and normalization).
* 2) It controls and coordinates with an instance of
* the IContentSink interface, to coordinate the
* the production of the content model.
*
* The basic operation of this class assumes that an HTML
* document is non-normalized. Therefore, we don't process
* the document in a normalized way. Don't bother to look
* for methods like: doHead() or doBody().
*
* Instead, in order to be backward compatible, we must
* scan the set of tokens and perform this basic set of
* operations:
* 1) Determine the token type (easy, since the tokens know)
* 2) Determine the appropriate section of the HTML document
* each token belongs in (HTML,HEAD,BODY,FRAMESET).
* 3) Insert content into our document (via the sink) into
* the correct section.
* 4) In the case of tags that belong in the BODY, we must
* ensure that our underlying document state reflects
* the appropriate context for our tag.
*
* For example,if we see a <TR>, we must ensure our
* document contains a table into which the row can
* be placed. This may result in "implicit containers"
* created to ensure a well-formed document.
*
*/
#ifndef NS_PARSER__
#define NS_PARSER__
#include "nsIParser.h"
#include "nsDeque.h"
#include "nsIURL.h"
#include "CParserContext.h"
#include "nsParserCIID.h"
#include "nsITokenizer.h"
#include "nsHTMLTags.h"
#include "nsIContentSink.h"
#include "nsCOMArray.h"
#include "nsCycleCollectionParticipant.h"
#include "nsWeakReference.h"
class nsIDTD;
class nsIRunnable;
#ifdef _MSC_VER
#pragma warning( disable : 4275 )
#endif
class nsParser final : public nsIParser,
public nsIStreamListener,
public nsSupportsWeakReference
{
/**
* Destructor
* @update gess5/11/98
*/
virtual ~nsParser();
public:
/**
* Called on module init
*/
static nsresult Init();
/**
* Called on module shutdown
*/
static void Shutdown();
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsParser, nsIParser)
/**
* default constructor
* @update gess5/11/98
*/
nsParser();
/**
* Select given content sink into parser for parser output
* @update gess5/11/98
* @param aSink is the new sink to be used by parser
* @return old sink, or nullptr
*/
NS_IMETHOD_(void) SetContentSink(nsIContentSink* aSink) override;
/**
* retrive the sink set into the parser
* @update gess5/11/98
* @param aSink is the new sink to be used by parser
* @return old sink, or nullptr
*/
NS_IMETHOD_(nsIContentSink*) GetContentSink(void) override;
/**
* Call this method once you've created a parser, and want to instruct it
* about the command which caused the parser to be constructed. For example,
* this allows us to select a DTD which can do, say, view-source.
*
* @update gess 3/25/98
* @param aCommand -- ptrs to string that contains command
* @return nada
*/
NS_IMETHOD_(void) GetCommand(nsCString& aCommand) override;
NS_IMETHOD_(void) SetCommand(const char* aCommand) override;
NS_IMETHOD_(void) SetCommand(eParserCommands aParserCommand) override;
/**
* Call this method once you've created a parser, and want to instruct it
* about what charset to load
*
* @update ftang 4/23/99
* @param aCharset- the charset of a document
* @param aCharsetSource- the source of the charset
* @return nada
*/
NS_IMETHOD_(void) SetDocumentCharset(const nsACString& aCharset, int32_t aSource) override;
NS_IMETHOD_(void) GetDocumentCharset(nsACString& aCharset, int32_t& aSource) override
{
aCharset = mCharset;
aSource = mCharsetSource;
}
/**
* Cause parser to parse input from given URL
* @update gess5/11/98
* @param aURL is a descriptor for source document
* @param aListener is a listener to forward notifications to
* @return TRUE if all went well -- FALSE otherwise
*/
NS_IMETHOD Parse(nsIURI* aURL,
nsIRequestObserver* aListener = nullptr,
void* aKey = 0,
nsDTDMode aMode = eDTDMode_autodetect) override;
/**
* This method needs documentation
*/
NS_IMETHOD ParseFragment(const nsAString& aSourceBuffer,
nsTArray<nsString>& aTagStack) override;
/**
* This method gets called when the tokens have been consumed, and it's time
* to build the model via the content sink.
* @update gess5/11/98
* @return YES if model building went well -- NO otherwise.
*/
NS_IMETHOD BuildModel(void) override;
NS_IMETHOD ContinueInterruptedParsing() override;
NS_IMETHOD_(void) BlockParser() override;
NS_IMETHOD_(void) UnblockParser() override;
NS_IMETHOD_(void) ContinueInterruptedParsingAsync() override;
NS_IMETHOD Terminate(void) override;
/**
* Call this to query whether the parser is enabled or not.
*
* @update vidur 4/12/99
* @return current state
*/
NS_IMETHOD_(bool) IsParserEnabled() override;
/**
* Call this to query whether the parser thinks it's done with parsing.
*
* @update rickg 5/12/01
* @return complete state
*/
NS_IMETHOD_(bool) IsComplete() override;
/**
* This rather arcane method (hack) is used as a signal between the
* DTD and the parser. It allows the DTD to tell the parser that content
* that comes through (parser::parser(string)) but not consumed should
* propagate into the next string based parse call.
*
* @update gess 9/1/98
* @param aState determines whether we propagate unused string content.
* @return current state
*/
void SetUnusedInput(nsString& aBuffer);
/**
* This method gets called (automatically) during incremental parsing
* @update gess5/11/98
* @return TRUE if all went well, otherwise FALSE
*/
virtual nsresult ResumeParse(bool allowIteration = true,
bool aIsFinalChunk = false,
bool aCanInterrupt = true);
//*********************************************
// These methods are callback methods used by
// net lib to let us know about our inputstream.
//*********************************************
// nsIRequestObserver methods:
NS_DECL_NSIREQUESTOBSERVER
// nsIStreamListener methods:
NS_DECL_NSISTREAMLISTENER
void PushContext(CParserContext& aContext);
CParserContext* PopContext();
CParserContext* PeekContext() {return mParserContext;}
/**
* Get the channel associated with this parser
* @update harishd,gagan 07/17/01
* @param aChannel out param that will contain the result
* @return NS_OK if successful
*/
NS_IMETHOD GetChannel(nsIChannel** aChannel) override;
/**
* Get the DTD associated with this parser
* @update vidur 9/29/99
* @param aDTD out param that will contain the result
* @return NS_OK if successful, NS_ERROR_FAILURE for runtime error
*/
NS_IMETHOD GetDTD(nsIDTD** aDTD) override;
/**
* Get the nsIStreamListener for this parser
*/
virtual nsIStreamListener* GetStreamListener() override;
void SetSinkCharset(nsACString& aCharset);
/**
* Removes continue parsing events
* @update kmcclusk 5/18/98
*/
NS_IMETHODIMP CancelParsingEvents() override;
/**
* Return true.
*/
virtual bool IsInsertionPointDefined() override;
/**
* No-op.
*/
virtual void BeginEvaluatingParserInsertedScript() override;
/**
* No-op.
*/
virtual void EndEvaluatingParserInsertedScript() override;
/**
* No-op.
*/
virtual void MarkAsNotScriptCreated(const char* aCommand) override;
/**
* Always false.
*/
virtual bool IsScriptCreated() override;
/**
* Set to parser state to indicate whether parsing tokens can be interrupted
* @param aCanInterrupt true if parser can be interrupted, false if it can not be interrupted.
* @update kmcclusk 5/18/98
*/
void SetCanInterrupt(bool aCanInterrupt);
/**
* This is called when the final chunk has been
* passed to the parser and the content sink has
* interrupted token processing. It schedules
* a ParserContinue PL_Event which will ask the parser
* to HandleParserContinueEvent when it is handled.
* @update kmcclusk6/1/2001
*/
nsresult PostContinueEvent();
/**
* Fired when the continue parse event is triggered.
* @update kmcclusk 5/18/98
*/
void HandleParserContinueEvent(class nsParserContinueEvent *);
virtual void Reset() override {
Cleanup();
Initialize();
}
bool IsScriptExecuting() {
return mSink && mSink->IsScriptExecuting();
}
bool IsOkToProcessNetworkData() {
return !IsScriptExecuting() && !mProcessingNetworkData;
}
protected:
void Initialize(bool aConstructor = false);
void Cleanup();
/**
*
* @update gess5/18/98
* @param
* @return
*/
nsresult WillBuildModel(nsString& aFilename);
/**
*
* @update gess5/18/98
* @param
* @return
*/
nsresult DidBuildModel(nsresult anErrorCode);
private:
/*******************************************
These are the tokenization methods...
*******************************************/
/**
* Part of the code sandwich, this gets called right before
* the tokenization process begins. The main reason for
* this call is to allow the delegate to do initialization.
*
* @update gess 3/25/98
* @param
* @return TRUE if it's ok to proceed
*/
bool WillTokenize(bool aIsFinalChunk = false);
/**
* This is the primary control routine. It iteratively
* consumes tokens until an error occurs or you run out
* of data.
*
* @update gess 3/25/98
* @return error code
*/
nsresult Tokenize(bool aIsFinalChunk = false);
/**
* Pushes XML fragment parsing data to expat without an input stream.
*/
nsresult Parse(const nsAString& aSourceBuffer,
void* aKey,
bool aLastCall);
protected:
//*********************************************
// And now, some data members...
//*********************************************
CParserContext* mParserContext;
nsCOMPtr<nsIDTD> mDTD;
nsCOMPtr<nsIRequestObserver> mObserver;
nsCOMPtr<nsIContentSink> mSink;
nsIRunnable* mContinueEvent; // weak ref
eParserCommands mCommand;
nsresult mInternalState;
nsresult mStreamStatus;
int32_t mCharsetSource;
uint16_t mFlags;
nsString mUnusedInput;
nsCString mCharset;
nsCString mCommandStr;
bool mProcessingNetworkData;
bool mIsAboutBlank;
};
#endif