diff -r 000000000000 -r 6474c204b198 dom/events/IMEStateManager.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dom/events/IMEStateManager.h Wed Dec 31 06:09:35 2014 +0100
@@ -0,0 +1,160 @@
+/* -*- Mode: C++; tab-width: 2; 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/. */
+
+#ifndef mozilla_IMEStateManager_h_
+#define mozilla_IMEStateManager_h_
+
+#include "mozilla/EventForwards.h"
+#include "nsIWidget.h"
+
+class nsIContent;
+class nsIDOMMouseEvent;
+class nsINode;
+class nsPIDOMWindow;
+class nsPresContext;
+class nsISelection;
+
+namespace mozilla {
+
+class EventDispatchingCallback;
+class IMEContentObserver;
+class TextCompositionArray;
+class TextComposition;
+
+/**
+ * IMEStateManager manages InputContext (e.g., active editor type, IME enabled
+ * state and IME open state) of nsIWidget instances, manages IMEContentObserver
+ * and provides useful API for IME.
+ */
+
+class IMEStateManager
+{
+ typedef widget::IMEMessage IMEMessage;
+ typedef widget::IMEState IMEState;
+ typedef widget::InputContext InputContext;
+ typedef widget::InputContextAction InputContextAction;
+
+public:
+ static void Shutdown();
+
+ static nsresult OnDestroyPresContext(nsPresContext* aPresContext);
+ static nsresult OnRemoveContent(nsPresContext* aPresContext,
+ nsIContent* aContent);
+ /**
+ * OnChangeFocus() should be called when focused content is changed or
+ * IME enabled state is changed. If nobody has focus, set both aPresContext
+ * and aContent nullptr. E.g., all windows are deactivated.
+ */
+ static nsresult OnChangeFocus(nsPresContext* aPresContext,
+ nsIContent* aContent,
+ InputContextAction::Cause aCause);
+ static void OnInstalledMenuKeyboardListener(bool aInstalling);
+
+ // These two methods manage focus and selection/text observers.
+ // They are separate from OnChangeFocus above because this offers finer
+ // control compared to having the two methods incorporated into OnChangeFocus
+
+ // Get the focused editor's selection and root
+ static nsresult GetFocusSelectionAndRoot(nsISelection** aSel,
+ nsIContent** aRoot);
+ // This method updates the current IME state. However, if the enabled state
+ // isn't changed by the new state, this method does nothing.
+ // Note that this method changes the IME state of the active element in the
+ // widget. So, the caller must have focus.
+ static void UpdateIMEState(const IMEState &aNewIMEState,
+ nsIContent* aContent);
+
+ // This method is called when user clicked in an editor.
+ // aContent must be:
+ // If the editor is for or