123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* 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/. */
- /*
- * nsConsoleService class declaration.
- */
- #ifndef __nsconsoleservice_h__
- #define __nsconsoleservice_h__
- #include "mozilla/Attributes.h"
- #include "mozilla/Mutex.h"
- #include "nsInterfaceHashtable.h"
- #include "nsHashKeys.h"
- #include "nsIConsoleService.h"
- class nsConsoleService final : public nsIConsoleService,
- public nsIObserver
- {
- public:
- nsConsoleService();
- nsresult Init();
- NS_DECL_THREADSAFE_ISUPPORTS
- NS_DECL_NSICONSOLESERVICE
- NS_DECL_NSIOBSERVER
- void SetIsDelivering()
- {
- MOZ_ASSERT(NS_IsMainThread());
- MOZ_ASSERT(!mDeliveringMessage);
- mDeliveringMessage = true;
- }
- void SetDoneDelivering()
- {
- MOZ_ASSERT(NS_IsMainThread());
- MOZ_ASSERT(mDeliveringMessage);
- mDeliveringMessage = false;
- }
- // This is a variant of LogMessage which allows the caller to determine
- // if the message should be output to an OS-specific log.
- enum OutputMode {
- SuppressLog,
- OutputToLog
- };
- virtual nsresult LogMessageWithMode(nsIConsoleMessage* aMessage,
- OutputMode aOutputMode);
- typedef nsInterfaceHashtable<nsISupportsHashKey,
- nsIConsoleListener> ListenerHash;
- void CollectCurrentListeners(nsCOMArray<nsIConsoleListener>& aListeners);
- private:
- class MessageElement : public mozilla::LinkedListElement<MessageElement>
- {
- public:
- explicit MessageElement(nsIConsoleMessage* aMessage) : mMessage(aMessage)
- {}
- nsIConsoleMessage* Get()
- {
- return mMessage.get();
- }
- // Swap directly into an nsCOMPtr to avoid spurious refcount
- // traffic off the main thread in debug builds from
- // NSCAP_ASSERT_NO_QUERY_NEEDED().
- void swapMessage(nsCOMPtr<nsIConsoleMessage>& aRetVal)
- {
- mMessage.swap(aRetVal);
- }
- ~MessageElement();
- private:
- nsCOMPtr<nsIConsoleMessage> mMessage;
- MessageElement(const MessageElement&) = delete;
- MessageElement& operator=(const MessageElement&) = delete;
- MessageElement(MessageElement&&) = delete;
- MessageElement& operator=(MessageElement&&) = delete;
- };
- ~nsConsoleService();
- void ClearMessagesForWindowID(const uint64_t innerID);
- void ClearMessages();
- mozilla::LinkedList<MessageElement> mMessages;
- // The current size of mMessages.
- uint32_t mCurrentSize;
- // The maximum size of mMessages.
- uint32_t mMaximumSize;
- // Are we currently delivering a console message on the main thread? If
- // so, we suppress incoming messages on the main thread only, to avoid
- // infinite repitition.
- bool mDeliveringMessage;
- // Listeners to notify whenever a new message is logged.
- ListenerHash mListeners;
- // To serialize interesting methods.
- mozilla::Mutex mLock;
- };
- #endif /* __nsconsoleservice_h__ */
|