diff options
author | Brian Smith <brian@dbsoft.org> | 2022-08-18 16:30:38 -0500 |
---|---|---|
committer | Brian Smith <brian@dbsoft.org> | 2022-08-18 16:30:38 -0500 |
commit | b52731f9e00920ad9e750069bf5e2f4547cb0893 (patch) | |
tree | 65a756bf799aa70f09286b0a93fd08a8cd0edc8d /dom/base/EventSource.h | |
parent | 544366e3010ea16601ff363a2f41df5f84f77d47 (diff) | |
download | uxp-b52731f9e00920ad9e750069bf5e2f4547cb0893.tar.gz |
Issue #1990 - Part 1 - EventSource for workers - Mozilla Bug 1267903
Diffstat (limited to 'dom/base/EventSource.h')
-rw-r--r-- | dom/base/EventSource.h | 214 |
1 files changed, 37 insertions, 177 deletions
diff --git a/dom/base/EventSource.h b/dom/base/EventSource.h index b22cebd47a..cd43481908 100644 --- a/dom/base/EventSource.h +++ b/dom/base/EventSource.h @@ -35,221 +35,81 @@ namespace dom { struct EventSourceInit; +class EventSourceImpl; + class EventSource final : public DOMEventTargetHelper - , public nsIObserver - , public nsIStreamListener - , public nsIChannelEventSink - , public nsIInterfaceRequestor - , public nsSupportsWeakReference { + friend class EventSourceImpl; public: - explicit EventSource(nsPIDOMWindowInner* aOwnerWindow); NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_INHERITED( EventSource, DOMEventTargetHelper) - NS_DECL_NSIOBSERVER - NS_DECL_NSISTREAMLISTENER - NS_DECL_NSIREQUESTOBSERVER - NS_DECL_NSICHANNELEVENTSINK - NS_DECL_NSIINTERFACEREQUESTOR + // EventTarget + void DisconnectFromOwner() override + { + DOMEventTargetHelper::DisconnectFromOwner(); + Close(); + } - // nsWrapperCache - virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override; + JSObject* WrapObject(JSContext* aCx, + JS::Handle<JSObject*> aGivenProto) override; // WebIDL - nsPIDOMWindowInner* - GetParentObject() const - { - return GetOwner(); - } static already_AddRefed<EventSource> Constructor(const GlobalObject& aGlobal, const nsAString& aURL, - const EventSourceInit& aEventSourceInitDict, - ErrorResult& aRv); + const EventSourceInit& aEventSourceInitDict, ErrorResult& aRv); void GetUrl(nsAString& aURL) const { + AssertIsOnTargetThread(); aURL = mOriginalURL; } + bool WithCredentials() const { + AssertIsOnTargetThread(); return mWithCredentials; } - enum { - CONNECTING = 0U, - OPEN = 1U, - CLOSED = 2U - }; uint16_t ReadyState() const { + AssertIsOnTargetThread(); return mReadyState; } IMPL_EVENT_HANDLER(open) IMPL_EVENT_HANDLER(message) IMPL_EVENT_HANDLER(error) - void Close(); - virtual void DisconnectFromOwner() override; + void Close(); -protected: +private: + EventSource(nsPIDOMWindowInner* aOwnerWindow, bool aWithCredentials); virtual ~EventSource(); + // prevent bad usage + EventSource(const EventSource& x) = delete; + EventSource& operator=(const EventSource& x) = delete; - MOZ_IS_CLASS_INIT - nsresult Init(nsISupports* aOwner, - const nsAString& aURL, - bool aWithCredentials); - - nsresult GetBaseURI(nsIURI **aBaseURI); - - void SetupHttpChannel(); - nsresult SetupReferrerPolicy(); - nsresult InitChannelAndRequestEventSource(); - nsresult ResetConnection(); - nsresult DispatchFailConnection(); - nsresult SetReconnectionTimeout(); - - void AnnounceConnection(); - void DispatchAllMessageEvents(); - void ReestablishConnection(); - void FailConnection(); - - nsresult Thaw(); - nsresult Freeze(); - - static void TimerCallback(nsITimer *aTimer, void *aClosure); - - nsresult PrintErrorOnConsole(const char *aBundleURI, - const char16_t *aError, - const char16_t **aFormatStrings, - uint32_t aFormatStringsLen); - nsresult ConsoleError(); - - static nsresult StreamReaderFunc(nsIInputStream *aInputStream, - void *aClosure, - const char *aFromRawSegment, - uint32_t aToOffset, - uint32_t aCount, - uint32_t *aWriteCount); - nsresult SetFieldAndClear(); - nsresult ClearFields(); - nsresult ResetEvent(); - nsresult DispatchCurrentMessageEvent(); - nsresult ParseCharacter(char16_t aChr); - nsresult CheckHealthOfRequestCallback(nsIRequest *aRequestCallback); - nsresult OnRedirectVerifyCallback(nsresult result); - - nsCOMPtr<nsIURI> mSrc; - - nsString mLastEventID; - uint32_t mReconnectionTime; // in ms - - struct Message { - nsString mEventName; - nsString mLastEventID; - nsString mData; - }; - nsDeque mMessagesToDispatch; - Message mCurrentMessage; - - /** - * A simple state machine used to manage the event-source's line buffer - * - * PARSE_STATE_OFF -> PARSE_STATE_BEGIN_OF_STREAM - * - * PARSE_STATE_BEGIN_OF_STREAM -> PARSE_STATE_BOM_WAS_READ | - * PARSE_STATE_CR_CHAR | - * PARSE_STATE_BEGIN_OF_LINE | - * PARSE_STATE_COMMENT | - * PARSE_STATE_FIELD_NAME - * - * PARSE_STATE_BOM_WAS_READ -> PARSE_STATE_CR_CHAR | - * PARSE_STATE_BEGIN_OF_LINE | - * PARSE_STATE_COMMENT | - * PARSE_STATE_FIELD_NAME - * - * PARSE_STATE_CR_CHAR -> PARSE_STATE_CR_CHAR | - * PARSE_STATE_COMMENT | - * PARSE_STATE_FIELD_NAME | - * PARSE_STATE_BEGIN_OF_LINE - * - * PARSE_STATE_COMMENT -> PARSE_STATE_CR_CHAR | - * PARSE_STATE_BEGIN_OF_LINE - * - * PARSE_STATE_FIELD_NAME -> PARSE_STATE_CR_CHAR | - * PARSE_STATE_BEGIN_OF_LINE | - * PARSE_STATE_FIRST_CHAR_OF_FIELD_VALUE - * - * PARSE_STATE_FIRST_CHAR_OF_FIELD_VALUE -> PARSE_STATE_FIELD_VALUE | - * PARSE_STATE_CR_CHAR | - * PARSE_STATE_BEGIN_OF_LINE - * - * PARSE_STATE_FIELD_VALUE -> PARSE_STATE_CR_CHAR | - * PARSE_STATE_BEGIN_OF_LINE - * - * PARSE_STATE_BEGIN_OF_LINE -> PARSE_STATE_CR_CHAR | - * PARSE_STATE_COMMENT | - * PARSE_STATE_FIELD_NAME | - * PARSE_STATE_BEGIN_OF_LINE - * - * Whenever the parser find an empty line or the end-of-file - * it dispatches the stacked event. - * - */ - enum ParserStatus { - PARSE_STATE_OFF, - PARSE_STATE_BEGIN_OF_STREAM, - PARSE_STATE_BOM_WAS_READ, - PARSE_STATE_CR_CHAR, - PARSE_STATE_COMMENT, - PARSE_STATE_FIELD_NAME, - PARSE_STATE_FIRST_CHAR_OF_FIELD_VALUE, - PARSE_STATE_FIELD_VALUE, - PARSE_STATE_BEGIN_OF_LINE - }; - ParserStatus mStatus; - - bool mFrozen; - bool mErrorLoadOnRedirect; - bool mGoingToDispatchAllMessages; - bool mWithCredentials; - bool mWaitingForOnStopRequest; - - // used while reading the input streams - nsCOMPtr<nsIUnicodeDecoder> mUnicodeDecoder; - nsresult mLastConvertionResult; - nsString mLastFieldName; - nsString mLastFieldValue; - - nsCOMPtr<nsILoadGroup> mLoadGroup; - - nsCOMPtr<nsIHttpChannel> mHttpChannel; + void AssertIsOnTargetThread() const + { + MOZ_ASSERT(NS_IsMainThread() == mIsMainThread); + } - nsCOMPtr<nsITimer> mTimer; + nsresult CreateAndDispatchSimpleEvent(const nsAString& aName); - uint16_t mReadyState; + // Raw pointer because this EventSourceImpl is created, managed and destroyed + // by EventSource. + EventSourceImpl* mImpl; nsString mOriginalURL; + uint16_t mReadyState; + bool mWithCredentials; + bool mIsMainThread; + // This is used to keep EventSourceImpl instance when there is a connection. + bool mKeepingAlive; - nsCOMPtr<nsIPrincipal> mPrincipal; - nsString mOrigin; - - // Event Source owner information: - // - the script file name - // - source code line number and column number where the Event Source object - // was constructed. - // - the ID of the inner window where the script lives. Note that this may not - // be the same as the Event Source owner window. - // These attributes are used for error reporting. - nsString mScriptFile; - uint32_t mScriptLine; - uint32_t mScriptColumn; - uint64_t mInnerWindowID; - -private: - EventSource(const EventSource& x); // prevent bad usage - EventSource& operator=(const EventSource& x); + void UpdateMustKeepAlive(); + void UpdateDontKeepAlive(); }; } // namespace dom |