Chromium Code Reviews| Index: chrome/browser/chromeos/input_method/ibus_engine_controller.cc |
| diff --git a/chrome/browser/chromeos/input_method/ibus_engine_controller.cc b/chrome/browser/chromeos/input_method/ibus_engine_controller.cc |
| index 6aaf2c9f10acdacc0fb76179e1358cfd8b546e20..b2eeb69a813628fa24dd5250c51ff1f9120c9e09 100644 |
| --- a/chrome/browser/chromeos/input_method/ibus_engine_controller.cc |
| +++ b/chrome/browser/chromeos/input_method/ibus_engine_controller.cc |
| @@ -81,6 +81,10 @@ class IBusEngineControllerImpl : public IBusEngineController { |
| } |
| ~IBusEngineControllerImpl() { |
| + for (std::set<IBusChromeOSEngine*>::iterator ix = engine_instances_.begin(); |
| + ix != engine_instances_.end(); ++ix) { |
| + (*ix)->connection = NULL; |
|
Yusuke Sato
2011/12/05 03:42:13
Question: which function will delete the (*ix) obj
Zachary Kuznia
2011/12/06 01:50:08
It's owned and deleted by ibus.
|
| + } |
| if (preedit_text_) { |
| g_object_unref(preedit_text_); |
| preedit_text_ = NULL; |
| @@ -710,49 +714,61 @@ class IBusEngineControllerImpl : public IBusEngineController { |
| GDBusMethodInvocation* key_data) { |
| VLOG(1) << "OnProcessKeyEvent"; |
| IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine); |
| - engine->connection->observer_->OnKeyEvent( |
| - !(modifiers & IBUS_RELEASE_MASK), |
| - keyval, keycode, |
| - modifiers & IBUS_MOD1_MASK, |
| - modifiers & IBUS_CONTROL_MASK, |
| - modifiers & IBUS_SHIFT_MASK, |
| - reinterpret_cast<KeyEventHandle*>(key_data)); |
| + if (engine->connection) { |
| + engine->connection->observer_->OnKeyEvent( |
| + !(modifiers & IBUS_RELEASE_MASK), |
| + keyval, keycode, |
| + modifiers & IBUS_MOD1_MASK, |
| + modifiers & IBUS_CONTROL_MASK, |
| + modifiers & IBUS_SHIFT_MASK, |
| + reinterpret_cast<KeyEventHandle*>(key_data)); |
| + } |
| } |
| static void OnReset(IBusEngine* ibus_engine) { |
| VLOG(1) << "OnReset"; |
| IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine); |
| - engine->connection->observer_->OnReset(); |
| + if (engine->connection) { |
| + engine->connection->observer_->OnReset(); |
| + } |
| } |
| static void OnEnable(IBusEngine* ibus_engine) { |
| VLOG(1) << "OnEnable"; |
| IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine); |
| - engine->connection->active_engine_ = engine; |
| - engine->connection->observer_->OnEnable(); |
| - engine->connection->SetProperties(); |
| + if (engine->connection) { |
| + engine->connection->active_engine_ = engine; |
| + engine->connection->observer_->OnEnable(); |
| + engine->connection->SetProperties(); |
| + } |
| } |
| static void OnDisable(IBusEngine* ibus_engine) { |
| VLOG(1) << "OnDisable"; |
| IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine); |
| - engine->connection->observer_->OnDisable(); |
| - if (engine->connection->active_engine_ == engine) { |
| - engine->connection->active_engine_ = NULL; |
| + if (engine->connection) { |
| + engine->connection->observer_->OnDisable(); |
| + if (engine->connection->active_engine_ == engine) { |
| + engine->connection->active_engine_ = NULL; |
| + } |
| } |
| } |
| static void OnFocusIn(IBusEngine* ibus_engine) { |
| VLOG(1) << "OnFocusIn"; |
| IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine); |
| - engine->connection->observer_->OnFocusIn(); |
| - engine->connection->SetProperties(); |
| + if (engine->connection) { |
| + engine->connection->observer_->OnFocusIn(); |
| + engine->connection->SetProperties(); |
| + } |
| } |
| static void OnFocusOut(IBusEngine* ibus_engine) { |
| VLOG(1) << "OnFocusOut"; |
| IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine); |
| - engine->connection->observer_->OnFocusOut(); |
| + if (engine->connection) { |
| + engine->connection->observer_->OnFocusOut(); |
| + } |
| } |
| static void OnPageUp(IBusEngine* ibus_engine) { |
| @@ -775,25 +791,29 @@ class IBusEngineControllerImpl : public IBusEngineController { |
| const gchar *prop_name, guint prop_state) { |
| VLOG(1) << "OnPropertyActivate"; |
| IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine); |
| - engine->connection->observer_->OnPropertyActivate(prop_name, prop_state); |
| + if (engine->connection) { |
| + engine->connection->observer_->OnPropertyActivate(prop_name, prop_state); |
| + } |
| } |
| static void OnCandidateClicked(IBusEngine* ibus_engine, guint index, |
| guint button, guint state) { |
| VLOG(1) << "OnCandidateClicked"; |
| IBusChromeOSEngine* engine = IBUS_CHROMEOS_ENGINE(ibus_engine); |
| - int pressed_button = 0; |
| - if (button & IBUS_BUTTON1_MASK) { |
| - pressed_button |= MOUSE_BUTTON_1_MASK; |
| - } |
| - if (button & IBUS_BUTTON2_MASK) { |
| - pressed_button |= MOUSE_BUTTON_2_MASK; |
| - } |
| - if (button & IBUS_BUTTON3_MASK) { |
| - pressed_button |= MOUSE_BUTTON_3_MASK; |
| + if (engine->connection) { |
| + int pressed_button = 0; |
| + if (button & IBUS_BUTTON1_MASK) { |
| + pressed_button |= MOUSE_BUTTON_1_MASK; |
| + } |
| + if (button & IBUS_BUTTON2_MASK) { |
| + pressed_button |= MOUSE_BUTTON_2_MASK; |
| + } |
| + if (button & IBUS_BUTTON3_MASK) { |
| + pressed_button |= MOUSE_BUTTON_3_MASK; |
| + } |
| + engine->connection->observer_->OnCandidateClicked(index, pressed_button, |
| + state); |
| } |
| - engine->connection->observer_->OnCandidateClicked(index, pressed_button, |
| - state); |
| } |
| static GObject* EngineConstructor(GType type, guint n_construct_params, |
| @@ -805,6 +825,8 @@ class IBusEngineControllerImpl : public IBusEngineController { |
| ConnectionMap::iterator connection = g_connections_->find(name); |
| if (connection == g_connections_->end()) { |
| LOG(ERROR) << "Connection never created: " << name; |
| + engine->connection = NULL; |
| + engine->table = NULL; |
| return (GObject *) engine; |
| } |