diff options
-rw-r--r-- | chrome/browser/chromeos/cros/cros_mock.cc | 2 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/input_method_library.cc | 97 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/input_method_library.h | 8 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/mock_input_method_library.h | 4 | ||||
-rw-r--r-- | chrome/browser/chromeos/input_method/candidate_window.cc | 9 | ||||
-rw-r--r-- | chrome/browser/chromeos/input_method/candidate_window.gyp | 30 | ||||
-rw-r--r-- | chrome/browser/chromeos/input_method/candidate_window_main.cc | 78 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/user_manager.cc | 2 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | tools/cros.DEPS/DEPS | 2 |
10 files changed, 61 insertions, 173 deletions
diff --git a/chrome/browser/chromeos/cros/cros_mock.cc b/chrome/browser/chromeos/cros/cros_mock.cc index a5d8a38..a9cfe4d 100644 --- a/chrome/browser/chromeos/cros/cros_mock.cc +++ b/chrome/browser/chromeos/cros/cros_mock.cc @@ -254,7 +254,7 @@ void CrosMock::SetInputMethodLibraryStatusAreaExpectations() { EXPECT_CALL(*mock_input_method_library_, SetDeferImeStartup(_)) .Times(AnyNumber()) .RetiresOnSaturation(); - EXPECT_CALL(*mock_input_method_library_, StopInputMethodProcesses()) + EXPECT_CALL(*mock_input_method_library_, StopInputMethodDaemon()) .Times(AnyNumber()) .RetiresOnSaturation(); } diff --git a/chrome/browser/chromeos/cros/input_method_library.cc b/chrome/browser/chromeos/cros/input_method_library.cc index ab2dc48..ac73cbd 100644 --- a/chrome/browser/chromeos/cros/input_method_library.cc +++ b/chrome/browser/chromeos/cros/input_method_library.cc @@ -16,6 +16,7 @@ #include "chrome/browser/browser_thread.h" #include "chrome/browser/chromeos/cros/cros_library.h" #include "chrome/browser/chromeos/cros/keyboard_library.h" +#include "chrome/browser/chromeos/input_method/candidate_window.h" #include "chrome/browser/chromeos/input_method/input_method_util.h" #include "chrome/browser/chromeos/language_preferences.h" #include "chrome/common/notification_observer.h" @@ -25,7 +26,6 @@ namespace { const char kIBusDaemonPath[] = "/usr/bin/ibus-daemon"; -const char kCandidateWindowPath[] = "/opt/google/chrome/candidate_window"; // Finds a property which has |new_prop.key| from |prop_list|, and replaces the // property with |new_prop|. Returns true if such a property is found. @@ -62,7 +62,7 @@ class InputMethodLibraryImpl : public InputMethodLibrary, enable_auto_ime_shutdown_(true), should_change_input_method_(false), ibus_daemon_process_id_(0), - candidate_window_process_id_(0) { + candidate_window_controller_(NULL) { // TODO(yusukes): Using both CreateFallbackInputMethodDescriptors and // chromeos::GetHardwareKeyboardLayoutName doesn't look clean. Probably // we should unify these APIs. @@ -72,8 +72,8 @@ class InputMethodLibraryImpl : public InputMethodLibrary, if (CrosLibrary::Get()->EnsureLoaded()) { current_input_method_id_ = chromeos::GetHardwareKeyboardLayoutName(); } - // Observe APP_EXITING to stop input method processes gracefully. - // Note that even if we fail to stop input method processes from + // Observe APP_EXITING to stop input method daemon gracefully. + // Note that even if we fail to stop input method daemon from // Chrome in case of a sudden crash, we have a way to do it from an // upstart script. See crosbug.com/6515 and crosbug.com/6995 for // details. @@ -126,7 +126,7 @@ class InputMethodLibraryImpl : public InputMethodLibrary, current_input_method_id_ = input_method_id; if (EnsureLoadedAndStarted()) { if (input_method_id != chromeos::GetHardwareKeyboardLayoutName()) { - StartInputMethodProcesses(); + StartInputMethodDaemon(); } ChangeInputMethodInternal(input_method_id); } @@ -166,7 +166,7 @@ class InputMethodLibraryImpl : public InputMethodLibrary, bool SetImeConfig(const std::string& section, const std::string& config_name, const ImeConfigValue& value) { // Before calling FlushImeConfig(), start input method process if necessary. - MaybeStartInputMethodProcesses(section, config_name, value); + MaybeStartInputMethodDaemon(section, config_name, value); const ConfigKeyType key = std::make_pair(section, config_name); current_config_values_[key] = value; @@ -176,7 +176,7 @@ class InputMethodLibraryImpl : public InputMethodLibrary, } // Stop input method process if necessary. - MaybeStopInputMethodProcesses(section, config_name, value); + MaybeStopInputMethodDaemon(section, config_name, value); return pending_config_requests_.empty(); } @@ -199,12 +199,12 @@ class InputMethodLibraryImpl : public InputMethodLibrary, } private: - // Starts input method processes based on the |defer_ime_startup_| flag and + // Starts input method daemon based on the |defer_ime_startup_| flag and // input method configuration being updated. |section| is a section name of // the input method configuration (e.g. "general", "general/hotkey"). // |config_name| is a name of the configuration (e.g. "preload_engines", // "previous_engine"). |value| is the configuration value to be set. - void MaybeStartInputMethodProcesses(const std::string& section, + void MaybeStartInputMethodDaemon(const std::string& section, const std::string& config_name, const ImeConfigValue& value) { if (section == language_prefs::kGeneralSectionName && @@ -217,19 +217,19 @@ class InputMethodLibraryImpl : public InputMethodLibrary, value.string_list_value[0] == hardware_layout_name) && !defer_ime_startup_) { // If there are no input methods other than one for the hardware - // keyboard, we don't start the input method processes. + // keyboard, we don't start the input method daemon. // When |defer_ime_startup_| is true, we don't start it either. - StartInputMethodProcesses(); + StartInputMethodDaemon(); } chromeos::SetActiveInputMethods(input_method_status_connection_, value); } } } - // Stops input method processes based on the |enable_auto_ime_shutdown_| flag + // Stops input method daemon based on the |enable_auto_ime_shutdown_| flag // and input method configuration being updated. - // See also: MaybeStartInputMethodProcesses(). - void MaybeStopInputMethodProcesses(const std::string& section, + // See also: MaybeStartInputMethodDaemon(). + void MaybeStopInputMethodDaemon(const std::string& section, const std::string& config_name, const ImeConfigValue& value) { if (section == language_prefs::kGeneralSectionName && @@ -243,8 +243,8 @@ class InputMethodLibraryImpl : public InputMethodLibrary, enable_auto_ime_shutdown_) { // If there are no input methods other than one for the hardware // keyboard, and |enable_auto_ime_shutdown_| is true, we'll stop the - // input method processes. - StopInputMethodProcesses(); + // input method daemon. + StopInputMethodDaemon(); } chromeos::SetActiveInputMethods(input_method_status_connection_, value); } @@ -483,9 +483,9 @@ class InputMethodLibraryImpl : public InputMethodLibrary, current_ime_properties_ = prop_list; } - void StartInputMethodProcesses() { + void StartInputMethodDaemon() { should_launch_ime_ = true; - MaybeLaunchInputMethodProcesses(); + MaybeLaunchInputMethodDaemon(); } void UpdateProperty(const ImePropertyList& prop_list) { @@ -530,33 +530,27 @@ class InputMethodLibraryImpl : public InputMethodLibrary, return true; } - // Launches input method processes if these are not yet running. - void MaybeLaunchInputMethodProcesses() { + // Launches input method daemon if these are not yet running. + void MaybeLaunchInputMethodDaemon() { if (!should_launch_ime_) { return; } + if (!candidate_window_controller_.get()) { + candidate_window_controller_.reset(new CandidateWindowController); + if (!candidate_window_controller_->Init()) { + LOG(WARNING) << "Failed to initialize the candidate window controller"; + } + } + if (ibus_daemon_process_id_ == 0) { // TODO(zork): Send output to /var/log/ibus.log const std::string ibus_daemon_command_line = StringPrintf("%s --panel=disable --cache=none --restart --replace", kIBusDaemonPath); - if (!LaunchInputMethodProcess(ibus_daemon_command_line, - &ibus_daemon_process_id_)) { - // On failure, we should not attempt to launch candidate_window. - return; - } - } - - if (candidate_window_process_id_ == 0) { - // Pass the UI language info to candidate_window via --lang flag. - const std::string candidate_window_command_line = - StringPrintf("%s --lang=%s", kCandidateWindowPath, - g_browser_process->GetApplicationLocale().c_str()); - if (!LaunchInputMethodProcess(candidate_window_command_line, - &candidate_window_process_id_)) { - // Return here just in case we add more code below. - return; + if (!LaunchInputMethodProcess( + ibus_daemon_command_line, &ibus_daemon_process_id_)) { + LOG(ERROR) << "Failed to launch " << ibus_daemon_command_line; } } } @@ -567,15 +561,13 @@ class InputMethodLibraryImpl : public InputMethodLibrary, g_spawn_close_pid(pid); if (library->ibus_daemon_process_id_ == pid) { library->ibus_daemon_process_id_ = 0; - } else if (library->candidate_window_process_id_ == pid) { - library->candidate_window_process_id_ = 0; } - // Restart input method processes if needed. - library->MaybeLaunchInputMethodProcesses(); + // Restart input method daemon if needed. + library->MaybeLaunchInputMethodDaemon(); } - void StopInputMethodProcesses() { + void StopInputMethodDaemon() { should_launch_ime_ = false; if (ibus_daemon_process_id_) { const std::string xkb_engine_name = @@ -594,12 +586,6 @@ class InputMethodLibraryImpl : public InputMethodLibrary, << "terminated"; ibus_daemon_process_id_ = 0; } - if (candidate_window_process_id_) { - kill(candidate_window_process_id_, SIGTERM); - VLOG(1) << "candidate_window (PID=" << candidate_window_process_id_ - << ") is terminated"; - candidate_window_process_id_ = 0; - } } void SetDeferImeStartup(bool defer) { @@ -615,9 +601,9 @@ class InputMethodLibraryImpl : public InputMethodLibrary, void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { - // Stop the input processes on browser shutdown. + // Stop the input method daemon on browser shutdown. if (type.value == NotificationType::APP_EXITING) { - StopInputMethodProcesses(); + StopInputMethodDaemon(); } } @@ -654,14 +640,14 @@ class InputMethodLibraryImpl : public InputMethodLibrary, // This is used to register this object to APP_EXITING notification. NotificationRegistrar notification_registrar_; - // True if we should launch the input method processes. + // True if we should launch the input method daemon. bool should_launch_ime_; // True if the connection to the IBus daemon is alive. bool ime_connected_; // If true, we'll defer the startup until a non-default method is // activated. bool defer_ime_startup_; - // True if we should stop input method processes when there are no input + // True if we should stop input method daemon when there are no input // methods other than one for the hardware keyboard. bool enable_auto_ime_shutdown_; // The ID of the current input method (ex. "mozc"). @@ -673,8 +659,9 @@ class InputMethodLibraryImpl : public InputMethodLibrary, // The process id of the IBus daemon. 0 if it's not running. The process // ID 0 is not used in Linux, hence it's safe to use 0 for this purpose. int ibus_daemon_process_id_; - // The process id of the candidate window. 0 if it's not running. - int candidate_window_process_id_; + + // The candidate window. + scoped_ptr<CandidateWindowController> candidate_window_controller_; DISALLOW_COPY_AND_ASSIGN(InputMethodLibraryImpl); }; @@ -740,8 +727,8 @@ class InputMethodLibraryStubImpl : public InputMethodLibrary { return current_ime_properties_; } - virtual void StartInputMethodProcesses() {} - virtual void StopInputMethodProcesses() {} + virtual void StartInputMethodDaemon() {} + virtual void StopInputMethodDaemon() {} virtual void SetDeferImeStartup(bool defer) {} virtual void SetEnableAutoImeShutdown(bool enable) {} diff --git a/chrome/browser/chromeos/cros/input_method_library.h b/chrome/browser/chromeos/cros/input_method_library.h index 26df7a7..07b07ef 100644 --- a/chrome/browser/chromeos/cros/input_method_library.h +++ b/chrome/browser/chromeos/cros/input_method_library.h @@ -106,11 +106,11 @@ class InputMethodLibrary { virtual std::string GetKeyboardOverlayId( const std::string& input_method_id) = 0; - // Sets the IME state to enabled, and launches its processes if needed. - virtual void StartInputMethodProcesses() = 0; + // Sets the IME state to enabled, and launches input method daemon if needed. + virtual void StartInputMethodDaemon() = 0; - // Disables the IME, and kills the processes if they are running. - virtual void StopInputMethodProcesses() = 0; + // Disables the IME, and kills the daemon process if they are running. + virtual void StopInputMethodDaemon() = 0; // Controls whether the IME process is started when preload engines are // specificed, or defered until a non-default method is activated. diff --git a/chrome/browser/chromeos/cros/mock_input_method_library.h b/chrome/browser/chromeos/cros/mock_input_method_library.h index 838326f..6957e81 100644 --- a/chrome/browser/chromeos/cros/mock_input_method_library.h +++ b/chrome/browser/chromeos/cros/mock_input_method_library.h @@ -35,8 +35,8 @@ class MockInputMethodLibrary : public InputMethodLibrary { MOCK_CONST_METHOD0(current_input_method, const InputMethodDescriptor&(void)); MOCK_CONST_METHOD0(current_ime_properties, const ImePropertyList&(void)); MOCK_METHOD1(GetKeyboardOverlayId, std::string(const std::string&)); - MOCK_METHOD0(StartInputMethodProcesses, void(void)); - MOCK_METHOD0(StopInputMethodProcesses, void(void)); + MOCK_METHOD0(StartInputMethodDaemon, void(void)); + MOCK_METHOD0(StopInputMethodDaemon, void(void)); MOCK_METHOD1(SetDeferImeStartup, void(bool)); MOCK_METHOD1(SetEnableAutoImeShutdown, void(bool)); }; diff --git a/chrome/browser/chromeos/input_method/candidate_window.cc b/chrome/browser/chromeos/input_method/candidate_window.cc index fb96d70..769a926 100644 --- a/chrome/browser/chromeos/input_method/candidate_window.cc +++ b/chrome/browser/chromeos/input_method/candidate_window.cc @@ -1397,8 +1397,8 @@ void CandidateWindowController::Impl::OnUpdateLookupTable( } void CandidateWindowController::Impl::OnCandidateCommitted(int index, - int button, - int flags) { + int button, + int flags) { NotifyCandidateClicked(ui_status_connection_, index, button, flags); } @@ -1406,8 +1406,9 @@ void CandidateWindowController::Impl::OnConnectionChange( void* input_method_library, bool connected) { if (!connected) { - MessageLoopForUI::current()->PostTask(FROM_HERE, - new MessageLoop::QuitTask()); + CandidateWindowController::Impl* controller = + static_cast<CandidateWindowController::Impl*>(input_method_library); + controller->candidate_window_->HideLookupTable(); } } diff --git a/chrome/browser/chromeos/input_method/candidate_window.gyp b/chrome/browser/chromeos/input_method/candidate_window.gyp index faa3788..89ce891 100644 --- a/chrome/browser/chromeos/input_method/candidate_window.gyp +++ b/chrome/browser/chromeos/input_method/candidate_window.gyp @@ -10,38 +10,8 @@ { 'target_name': 'candidate_window', 'type': 'executable', - 'dependencies': [ - '../../../../app/app.gyp:app_strings', - '../../../../base/base.gyp:base', - '../../../../build/linux/system.gyp:gtk', - '../../../../build/linux/system.gyp:x11', - '../../../../chrome/chrome.gyp:common_constants', - '../../../../skia/skia.gyp:skia', - '../../../../views/views.gyp:views', - ], 'sources': [ - 'candidate_window.h', - 'candidate_window.cc', 'candidate_window_main.cc', - # For loading libcros. - '../cros/cros_library_loader.cc', - ], - 'conditions': [ - ['system_libcros==0', { - 'dependencies': [ - '../../../../third_party/cros/cros_api.gyp:cros_api', - ], - 'include_dirs': [ - '../../../../third_party/', - ], - }], - ['system_libcros==1', { - 'link_settings': { - 'libraries': [ - '-lcrosapi', - ], - }, - }], ], }, ], diff --git a/chrome/browser/chromeos/input_method/candidate_window_main.cc b/chrome/browser/chromeos/input_method/candidate_window_main.cc index 0ffed0d..56252a1 100644 --- a/chrome/browser/chromeos/input_method/candidate_window_main.cc +++ b/chrome/browser/chromeos/input_method/candidate_window_main.cc @@ -2,81 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/chromeos/input_method/candidate_window.h" - -#include <gtk/gtk.h> - -#include <string> - -#include "app/app_paths.h" -#include "base/at_exit.h" -#include "base/command_line.h" -#include "base/message_loop.h" -#include "base/path_service.h" -#include "base/process_util.h" -#include "chrome/browser/chromeos/cros/cros_library_loader.h" -#include "chrome/common/chrome_paths.h" -#include "chrome/common/chrome_switches.h" -#include "grit/app_locale_settings.h" -#include "third_party/cros/chromeos_cros_api.h" -#include "ui/base/l10n/l10n_util.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/base/ui_base_paths.h" -#include "views/focus/accelerator_handler.h" - +// TODO(yusukes): Modify build script so build bots don't build and install +// candidate_window (crosbug.com/11380). Then, remove this file and the gyp +// target (crosbug.com/11381). int main(int argc, char** argv) { - // Initialize gtk stuff. - g_thread_init(NULL); - g_type_init(); - gtk_init(&argc, &argv); - - // Initialize Chrome stuff. - base::AtExitManager exit_manager; - base::EnableTerminationOnHeapCorruption(); - app::RegisterPathProvider(); - ui::RegisterPathProvider(); - CommandLine::Init(argc, argv); - - // Check if the UI language code is passed from the command line, - // otherwise, default to "en-US". - const CommandLine& command_line = *CommandLine::ForCurrentProcess(); - std::string ui_language_code = - command_line.GetSwitchValueASCII(switches::kCandidateWindowLang); - if (ui_language_code.empty()) { - ui_language_code = "en-US"; - } - ResourceBundle::InitSharedInstance(ui_language_code); - - // Change the UI font if needed. - const std::string font_name = - l10n_util::GetStringUTF8(IDS_UI_FONT_FAMILY_CROS); - // The font name should not be empty here, but just in case. - if (font_name != "default" && !font_name.empty()) { - // Don't use gtk_util::SetGtkFont() in chrome/browser/ui/gtk not to - // introduce a dependency to it. - g_object_set(gtk_settings_get_default(), - "gtk-font-name", font_name.c_str(), NULL); - } - - // Load libcros. - chrome::RegisterPathProvider(); // for libcros.so. - chromeos::CrosLibraryLoader lib_loader; - std::string error_string; - CHECK(lib_loader.Load(&error_string)) - << "Failed to load libcros, " << error_string; - - // Create the main message loop. - MessageLoop main_message_loop(MessageLoop::TYPE_UI); - - // Create the candidate window controller. - chromeos::CandidateWindowController controller; - if (!controller.Init()) { - return 1; - } - - // Start the main loop. - views::AcceleratorHandler accelerator_handler; - MessageLoopForUI::current()->Run(&accelerator_handler); - return 0; } diff --git a/chrome/browser/chromeos/login/user_manager.cc b/chrome/browser/chromeos/login/user_manager.cc index 38de932..9221b46 100644 --- a/chrome/browser/chromeos/login/user_manager.cc +++ b/chrome/browser/chromeos/login/user_manager.cc @@ -434,7 +434,7 @@ void UserManager::NotifyOnLogin() { SetDeferImeStartup(false); // Shut down the IME so that it will reload the user's settings. chromeos::CrosLibrary::Get()->GetInputMethodLibrary()-> - StopInputMethodProcesses(); + StopInputMethodDaemon(); // Let the window manager know that we're logged in now. WmIpc::instance()->SetLoggedInProperty(true); // Ensure we've opened the real user's key/certificate database. diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 3dcf629..1dc95c9 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -529,6 +529,8 @@ 'browser/chromeos/google_update_chromeos.cc', 'browser/chromeos/gview_request_interceptor.cc', 'browser/chromeos/gview_request_interceptor.h', + 'browser/chromeos/input_method/candidate_window.h', + 'browser/chromeos/input_method/candidate_window.cc', 'browser/chromeos/input_method/input_method_util.cc', 'browser/chromeos/input_method/input_method_util.h', 'browser/chromeos/language_preferences.cc', diff --git a/tools/cros.DEPS/DEPS b/tools/cros.DEPS/DEPS index 31b2bca..3f737d6 100644 --- a/tools/cros.DEPS/DEPS +++ b/tools/cros.DEPS/DEPS @@ -4,5 +4,5 @@ vars = { deps = { "src/third_party/cros": - Var("chromium_git") + "/cros.git@34a0e132", + Var("chromium_git") + "/cros.git@43fbb59c", } |