1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/base/ime/input_method_factory.h"
6
7#include "ui/base/ime/mock_input_method.h"
8
9#if defined(OS_CHROMEOS)
10#include "ui/base/ime/input_method_chromeos.h"
11#elif defined(OS_WIN)
12#include "base/win/metro.h"
13#include "ui/base/ime/input_method_win.h"
14#include "ui/base/ime/remote_input_method_win.h"
15#elif defined(OS_MACOSX)
16#include "ui/base/ime/input_method_mac.h"
17#elif defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
18#include "ui/base/ime/input_method_auralinux.h"
19#else
20#include "ui/base/ime/input_method_minimal.h"
21#endif
22
23namespace {
24
25bool g_input_method_set_for_testing = false;
26
27bool g_create_input_method_called = false;
28
29}  // namespace
30
31namespace ui {
32
33scoped_ptr<InputMethod> CreateInputMethod(
34    internal::InputMethodDelegate* delegate,
35    gfx::AcceleratedWidget widget) {
36  if (!g_create_input_method_called)
37    g_create_input_method_called = true;
38
39  if (g_input_method_set_for_testing)
40    return scoped_ptr<InputMethod>(new MockInputMethod(delegate));
41
42#if defined(OS_CHROMEOS)
43  return scoped_ptr<InputMethod>(new InputMethodChromeOS(delegate));
44#elif defined(OS_WIN)
45  if (IsRemoteInputMethodWinRequired(widget))
46    return CreateRemoteInputMethodWin(delegate);
47  return scoped_ptr<InputMethod>(new InputMethodWin(delegate, widget));
48#elif defined(OS_MACOSX)
49  return scoped_ptr<InputMethod>(new InputMethodMac(delegate));
50#elif defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
51  return scoped_ptr<InputMethod>(new InputMethodAuraLinux(delegate));
52#else
53  return scoped_ptr<InputMethod>(new InputMethodMinimal(delegate));
54#endif
55}
56
57void SetUpInputMethodFactoryForTesting() {
58  if (g_input_method_set_for_testing)
59    return;
60
61  CHECK(!g_create_input_method_called)
62      << "ui::SetUpInputMethodFactoryForTesting was called after use of "
63      << "ui::CreateInputMethod.  You must call "
64      << "ui::SetUpInputMethodFactoryForTesting earlier.";
65
66  g_input_method_set_for_testing = true;
67}
68
69}  // namespace ui
70