diff -r 000000000000 -r 6474c204b198 dom/events/IMEContentObserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/events/IMEContentObserver.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,93 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 sw=2 et 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 http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_IMEContentObserver_h_ +#define mozilla_IMEContentObserver_h_ + +#include "mozilla/Attributes.h" +#include "nsCOMPtr.h" +#include "nsCycleCollectionParticipant.h" +#include "nsIDocShell.h" // XXX Why does only this need to be included here? +#include "nsIReflowObserver.h" +#include "nsISelectionListener.h" +#include "nsIScrollObserver.h" +#include "nsIWidget.h" // for nsIMEUpdatePreference +#include "nsStubMutationObserver.h" +#include "nsWeakReference.h" + +class nsIContent; +class nsINode; +class nsISelection; +class nsPresContext; + +namespace mozilla { + +class EventStateManager; + +// IMEContentObserver notifies widget of any text and selection changes +// in the currently focused editor +class IMEContentObserver MOZ_FINAL : public nsISelectionListener, + public nsStubMutationObserver, + public nsIReflowObserver, + public nsIScrollObserver, + public nsSupportsWeakReference +{ +public: + IMEContentObserver(); + + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(IMEContentObserver, + nsISelectionListener) + NS_DECL_NSISELECTIONLISTENER + NS_DECL_NSIMUTATIONOBSERVER_CHARACTERDATACHANGED + NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED + NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED + NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED + NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTEWILLCHANGE + NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTECHANGED + NS_DECL_NSIREFLOWOBSERVER + + // nsIScrollObserver + virtual void ScrollPositionChanged() MOZ_OVERRIDE; + + void Init(nsIWidget* aWidget, nsPresContext* aPresContext, + nsIContent* aContent); + void Destroy(); + /** + * IMEContentObserver is stored by EventStateManager during observing. + * DisconnectFromEventStateManager() is called when EventStateManager stops + * storing the instance. + */ + void DisconnectFromEventStateManager(); + bool IsManaging(nsPresContext* aPresContext, nsIContent* aContent); + bool IsEditorHandlingEventForComposition() const; + bool KeepAliveDuringDeactive() const + { + return mUpdatePreference.WantDuringDeactive(); + } + nsIWidget* GetWidget() const { return mWidget; } + nsresult GetSelectionAndRoot(nsISelection** aSelection, + nsIContent** aRoot) const; + +private: + void NotifyContentAdded(nsINode* aContainer, int32_t aStart, int32_t aEnd); + void ObserveEditableNode(); + + nsCOMPtr mWidget; + nsCOMPtr mSelection; + nsCOMPtr mRootContent; + nsCOMPtr mEditableNode; + nsCOMPtr mDocShell; + + EventStateManager* mESM; + + nsIMEUpdatePreference mUpdatePreference; + uint32_t mPreAttrChangeLength; +}; + +} // namespace mozilla + +#endif // mozilla_IMEContentObserver_h_