diff options
author | hsumita@chromium.org <hsumita@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-25 05:01:17 +0000 |
---|---|---|
committer | hsumita@chromium.org <hsumita@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-25 05:01:17 +0000 |
commit | e1cbb1b95b4441b3f365de03cd892fee6486c214 (patch) | |
tree | 2c7bbfd993b89aae04a5b42090192a2b790ef360 /chromeos | |
parent | 4e9e1c745f10825e07491a0e3eaa96c87cceb6bc (diff) | |
download | chromium_src-e1cbb1b95b4441b3f365de03cd892fee6486c214.zip chromium_src-e1cbb1b95b4441b3f365de03cd892fee6486c214.tar.gz chromium_src-e1cbb1b95b4441b3f365de03cd892fee6486c214.tar.bz2 |
Fix crash bug of IME extension API.
BUG=147526,147539,149189
Review URL: https://chromiumcodereview.appspot.com/10968056
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@158527 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chromeos')
-rw-r--r-- | chromeos/dbus/ibus/ibus_engine_service.cc | 59 | ||||
-rw-r--r-- | chromeos/dbus/ibus/ibus_engine_service.h | 10 | ||||
-rw-r--r-- | chromeos/dbus/ibus/ibus_engine_service_unittest.cc | 131 | ||||
-rw-r--r-- | chromeos/dbus/ibus/mock_ibus_engine_service.cc | 5 | ||||
-rw-r--r-- | chromeos/dbus/ibus/mock_ibus_engine_service.h | 3 |
5 files changed, 178 insertions, 30 deletions
diff --git a/chromeos/dbus/ibus/ibus_engine_service.cc b/chromeos/dbus/ibus/ibus_engine_service.cc index dcfee83..06d205d 100644 --- a/chromeos/dbus/ibus/ibus_engine_service.cc +++ b/chromeos/dbus/ibus/ibus_engine_service.cc @@ -24,6 +24,7 @@ class IBusEngineServiceImpl : public IBusEngineService { IBusEngineServiceImpl(dbus::Bus* bus, const dbus::ObjectPath& object_path) : bus_(bus), + engine_handler_(NULL), object_path_(object_path), weak_ptr_factory_(this) { exported_object_ = bus->GetExportedObject(object_path_); @@ -130,12 +131,15 @@ class IBusEngineServiceImpl : public IBusEngineService { } // IBusEngineService override. - virtual void Initialize(IBusEngineHandlerInterface* handler) OVERRIDE { - if (engine_handler_.get() == NULL) { - engine_handler_.reset(handler); - } else { - LOG(ERROR) << "Already initialized."; - } + virtual void SetEngine(IBusEngineHandlerInterface* handler) OVERRIDE { + DVLOG_IF(1, engine_handler_ != NULL) << "Replace engine."; + engine_handler_ = handler; + } + + // IBusEngineService override. + virtual void UnsetEngine() OVERRIDE { + LOG_IF(ERROR, engine_handler_ == NULL) << "There is no engine."; + engine_handler_ = NULL; } // IBusEngineService override. @@ -225,7 +229,8 @@ class IBusEngineServiceImpl : public IBusEngineService { // Handles FocusIn method call from ibus-daemon. void FocusIn(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { - DCHECK(engine_handler_.get()); + if (engine_handler_ == NULL) + return; engine_handler_->FocusIn(); dbus::Response* response = dbus::Response::FromMethodCall(method_call); response_sender.Run(response); @@ -234,7 +239,8 @@ class IBusEngineServiceImpl : public IBusEngineService { // Handles FocusOut method call from ibus-daemon. void FocusOut(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { - DCHECK(engine_handler_.get()); + if (engine_handler_ == NULL) + return; engine_handler_->FocusOut(); dbus::Response* response = dbus::Response::FromMethodCall(method_call); response_sender.Run(response); @@ -243,7 +249,8 @@ class IBusEngineServiceImpl : public IBusEngineService { // Handles Enable method call from ibus-daemon. void Enable(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { - DCHECK(engine_handler_.get()); + if (engine_handler_ == NULL) + return; engine_handler_->Enable(); dbus::Response* response = dbus::Response::FromMethodCall(method_call); response_sender.Run(response); @@ -252,7 +259,8 @@ class IBusEngineServiceImpl : public IBusEngineService { // Handles Disable method call from ibus-daemon. void Disable(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { - DCHECK(engine_handler_.get()); + if (engine_handler_ == NULL) + return; engine_handler_->Disable(); dbus::Response* response = dbus::Response::FromMethodCall(method_call); response_sender.Run(response); @@ -261,6 +269,8 @@ class IBusEngineServiceImpl : public IBusEngineService { // Handles PropertyActivate method call from ibus-daemon. void PropertyActivate(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { + if (engine_handler_ == NULL) + return; dbus::MessageReader reader(method_call); std::string property_name; if (!reader.PopString(&property_name)) { @@ -274,7 +284,6 @@ class IBusEngineServiceImpl : public IBusEngineService { << method_call->ToString(); return; } - DCHECK(engine_handler_.get()); engine_handler_->PropertyActivate( property_name, static_cast<IBusEngineHandlerInterface::IBusPropertyState>( @@ -286,6 +295,8 @@ class IBusEngineServiceImpl : public IBusEngineService { // Handles PropertyShow method call from ibus-daemon. void PropertyShow(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { + if (engine_handler_ == NULL) + return; dbus::MessageReader reader(method_call); std::string property_name; if (!reader.PopString(&property_name)) { @@ -293,7 +304,6 @@ class IBusEngineServiceImpl : public IBusEngineService { << method_call->ToString(); return; } - DCHECK(engine_handler_.get()); engine_handler_->PropertyShow(property_name); dbus::Response* response = dbus::Response::FromMethodCall(method_call); response_sender.Run(response); @@ -302,6 +312,8 @@ class IBusEngineServiceImpl : public IBusEngineService { // Handles PropertyHide method call from ibus-daemon. void PropertyHide(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { + if (engine_handler_ == NULL) + return; dbus::MessageReader reader(method_call); std::string property_name; if (!reader.PopString(&property_name)) { @@ -309,7 +321,6 @@ class IBusEngineServiceImpl : public IBusEngineService { << method_call->ToString(); return; } - DCHECK(engine_handler_.get()); engine_handler_->PropertyHide(property_name); dbus::Response* response = dbus::Response::FromMethodCall(method_call); response_sender.Run(response); @@ -318,6 +329,8 @@ class IBusEngineServiceImpl : public IBusEngineService { // Handles SetCapability method call from ibus-daemon. void SetCapability(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { + if (engine_handler_ == NULL) + return; dbus::MessageReader reader(method_call); uint32 capability = 0; if (!reader.PopUint32(&capability)) { @@ -325,7 +338,6 @@ class IBusEngineServiceImpl : public IBusEngineService { << method_call->ToString(); return; } - DCHECK(engine_handler_.get()); engine_handler_->SetCapability( static_cast<IBusEngineHandlerInterface::IBusCapability>(capability)); dbus::Response* response = dbus::Response::FromMethodCall(method_call); @@ -334,7 +346,8 @@ class IBusEngineServiceImpl : public IBusEngineService { void Reset(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { - DCHECK(engine_handler_.get()); + if (engine_handler_ == NULL) + return; engine_handler_->Reset(); dbus::Response* response = dbus::Response::FromMethodCall(method_call); response_sender.Run(response); @@ -343,6 +356,8 @@ class IBusEngineServiceImpl : public IBusEngineService { // Handles ProcessKeyEvent method call from ibus-daemon. void ProcessKeyEvent(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { + if (engine_handler_ == NULL) + return; dbus::MessageReader reader(method_call); uint32 keysym = 0; if (!reader.PopUint32(&keysym)) { @@ -362,7 +377,6 @@ class IBusEngineServiceImpl : public IBusEngineService { << method_call->ToString(); return; } - DCHECK(engine_handler_.get()); engine_handler_->ProcessKeyEvent( keysym, keycode, state, base::Bind(&IBusEngineServiceImpl::KeyEventDone, @@ -375,6 +389,8 @@ class IBusEngineServiceImpl : public IBusEngineService { void KeyEventDone(dbus::Response* response, const dbus::ExportedObject::ResponseSender& response_sender, bool consume) { + if (engine_handler_ == NULL) + return; dbus::MessageWriter writer(response); writer.AppendBool(consume); response_sender.Run(response); @@ -383,6 +399,8 @@ class IBusEngineServiceImpl : public IBusEngineService { // Handles CandidateClicked method call from ibus-daemon. void CandidateClicked(dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { + if (engine_handler_ == NULL) + return; dbus::MessageReader reader(method_call); uint32 index = 0; if (!reader.PopUint32(&index)) { @@ -402,7 +420,6 @@ class IBusEngineServiceImpl : public IBusEngineService { << method_call->ToString(); return; } - DCHECK(engine_handler_.get()); engine_handler_->CandidateClicked( index, static_cast<IBusEngineHandlerInterface::IBusMouseButton>(button), @@ -415,6 +432,8 @@ class IBusEngineServiceImpl : public IBusEngineService { void SetSurroundingText( dbus::MethodCall* method_call, dbus::ExportedObject::ResponseSender response_sender) { + if (engine_handler_ == NULL) + return; dbus::MessageReader reader(method_call); std::string text; if (!reader.PopString(&text)) { @@ -435,7 +454,6 @@ class IBusEngineServiceImpl : public IBusEngineService { return; } - DCHECK(engine_handler_.get()); engine_handler_->SetSurroundingText(text, cursor_pos, anchor_pos); dbus::Response* response = dbus::Response::FromMethodCall(method_call); response_sender.Run(response); @@ -453,7 +471,7 @@ class IBusEngineServiceImpl : public IBusEngineService { dbus::Bus* bus_; // All incoming method calls are passed on to the |engine_handler_|. - scoped_ptr<IBusEngineHandlerInterface> engine_handler_; + IBusEngineHandlerInterface* engine_handler_; dbus::ObjectPath object_path_; scoped_refptr<dbus::ExportedObject> exported_object_; @@ -467,7 +485,8 @@ class IBusEngineServiceStubImpl : public IBusEngineService { IBusEngineServiceStubImpl() {} virtual ~IBusEngineServiceStubImpl() {} // IBusEngineService overrides. - virtual void Initialize(IBusEngineHandlerInterface* handler) OVERRIDE {} + virtual void SetEngine(IBusEngineHandlerInterface* handler) OVERRIDE {} + virtual void UnsetEngine() OVERRIDE {} virtual void RegisterProperties( const ibus::IBusPropertyList& property_list) OVERRIDE {} virtual void UpdatePreedit(const ibus::IBusText& ibus_text, diff --git a/chromeos/dbus/ibus/ibus_engine_service.h b/chromeos/dbus/ibus/ibus_engine_service.h index a7a11b4..f4aaba9 100644 --- a/chromeos/dbus/ibus/ibus_engine_service.h +++ b/chromeos/dbus/ibus/ibus_engine_service.h @@ -27,7 +27,7 @@ class IBusText; typedef ScopedVector<IBusProperty> IBusPropertyList; } // namespace -// A interface to handle the engine client method call. +// A interface to handle the engine handler method call. class CHROMEOS_EXPORT IBusEngineHandlerInterface { public: typedef base::Callback<void (bool consumed)> KeyEventDoneCallback; @@ -130,8 +130,12 @@ class CHROMEOS_EXPORT IBusEngineService { virtual ~IBusEngineService(); - // Initializes the engine client. This class takes the ownership of |handler|. - virtual void Initialize(IBusEngineHandlerInterface* handler) = 0; + // Sets a new IBus engine handler and old handler will be overridden. + // This class doesn't take the ownership of |handler|. + virtual void SetEngine(IBusEngineHandlerInterface* handler) = 0; + + // Unsets the current IBus engine hanlder. + virtual void UnsetEngine() = 0; // Emits RegisterProperties signal. virtual void RegisterProperties( diff --git a/chromeos/dbus/ibus/ibus_engine_service_unittest.cc b/chromeos/dbus/ibus/ibus_engine_service_unittest.cc index 3800087..f7f4d93 100644 --- a/chromeos/dbus/ibus/ibus_engine_service_unittest.cc +++ b/chromeos/dbus/ibus/ibus_engine_service_unittest.cc @@ -476,16 +476,16 @@ class IBusEngineServiceTest : public testing::Test { mock_bus_.get(), dbus::ObjectPath(kObjectPath))); - // Call Initialize to set engine handler. - engine_handler_ = new MockIBusEngineHandler(); - service_->Initialize(engine_handler_); + // Set engine handler. + engine_handler_.reset(new MockIBusEngineHandler()); + service_->SetEngine(engine_handler_.get()); } protected: // The service to be tested. scoped_ptr<IBusEngineService> service_; // The mock engine handler. Do not free, this is owned by IBusEngineService. - MockIBusEngineHandler* engine_handler_; + scoped_ptr<MockIBusEngineHandler> engine_handler_; // The mock bus. scoped_refptr<dbus::MockBus> mock_bus_; // The mock exported object. @@ -534,6 +534,15 @@ TEST_F(IBusEngineServiceTest, FocusInTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, FocusIn()).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kFocusInMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, FocusOutTest) { @@ -558,6 +567,15 @@ TEST_F(IBusEngineServiceTest, FocusOutTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, FocusOut()).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kFocusOutMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, EnableTest) { @@ -582,6 +600,15 @@ TEST_F(IBusEngineServiceTest, EnableTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, Enable()).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kEnableMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, DisableTest) { @@ -606,6 +633,15 @@ TEST_F(IBusEngineServiceTest, DisableTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, Disable()).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kDisableMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, PropertyActivateTest) { @@ -637,6 +673,16 @@ TEST_F(IBusEngineServiceTest, PropertyActivateTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, PropertyActivate(kPropertyName, + kIBusPropertyState)).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kPropertyActivateMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, ResetTest) { @@ -661,6 +707,15 @@ TEST_F(IBusEngineServiceTest, ResetTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, Reset()).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kResetMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, PropertyShowTest) { @@ -688,6 +743,15 @@ TEST_F(IBusEngineServiceTest, PropertyShowTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, PropertyShow(kPropertyName)).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kPropertyShowMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, PropertyHideTest) { @@ -715,6 +779,15 @@ TEST_F(IBusEngineServiceTest, PropertyHideTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, PropertyHide(kPropertyName)).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kPropertyHideMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, SetCapabilityTest) { @@ -743,6 +816,15 @@ TEST_F(IBusEngineServiceTest, SetCapabilityTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, SetCapability(kIBusCapability)).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kSetCapabilityMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, ProcessKeyEventTest) { @@ -779,6 +861,16 @@ TEST_F(IBusEngineServiceTest, ProcessKeyEventTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, + ProcessKeyEvent(kKeySym, kKeyCode, kState, _)).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kProcessKeyEventMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, DelayProcessKeyEventTest) { @@ -818,6 +910,16 @@ TEST_F(IBusEngineServiceTest, DelayProcessKeyEventTest) { // Call KeyEventDone callback. message_loop_.RunAllPending(); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, + ProcessKeyEvent(kKeySym, kKeyCode, kState, _)).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kProcessKeyEventMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, CandidateClickedTest) { @@ -851,6 +953,16 @@ TEST_F(IBusEngineServiceTest, CandidateClickedTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, CandidateClicked(kIndex, kIBusMouseButton, + kState)).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kCandidateClickedMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, SetSurroundingTextTest) { @@ -883,6 +995,16 @@ TEST_F(IBusEngineServiceTest, SetSurroundingTextTest) { &method_call, base::Bind(&MockResponseSender::Run, base::Unretained(&response_sender))); + + // Call exported function without engine. + service_->UnsetEngine(); + EXPECT_CALL(*engine_handler_, SetSurroundingText(kText, kCursorPos, + kAnchorPos)).Times(0); + EXPECT_CALL(response_sender, Run(_)).Times(0); + method_callback_map_[ibus::engine::kSetSurroundingTextMethod].Run( + &method_call, + base::Bind(&MockResponseSender::Run, + base::Unretained(&response_sender))); } TEST_F(IBusEngineServiceTest, RegisterProperties) { @@ -994,5 +1116,4 @@ TEST_F(IBusEngineServiceTest, RequireSurroundingTextTest) { service_->RequireSurroundingText(); } - } // namespace chromeos diff --git a/chromeos/dbus/ibus/mock_ibus_engine_service.cc b/chromeos/dbus/ibus/mock_ibus_engine_service.cc index eb04082..064c25e 100644 --- a/chromeos/dbus/ibus/mock_ibus_engine_service.cc +++ b/chromeos/dbus/ibus/mock_ibus_engine_service.cc @@ -12,7 +12,10 @@ MockIBusEngineService::MockIBusEngineService() { MockIBusEngineService::~MockIBusEngineService() { } -void MockIBusEngineService::Initialize(IBusEngineHandlerInterface* handler) { +void MockIBusEngineService::SetEngine(IBusEngineHandlerInterface* handler) { +} + +void MockIBusEngineService::UnsetEngine() { } void MockIBusEngineService::RegisterProperties( diff --git a/chromeos/dbus/ibus/mock_ibus_engine_service.h b/chromeos/dbus/ibus/mock_ibus_engine_service.h index f64aeba..ec7d407 100644 --- a/chromeos/dbus/ibus/mock_ibus_engine_service.h +++ b/chromeos/dbus/ibus/mock_ibus_engine_service.h @@ -16,7 +16,8 @@ class MockIBusEngineService : public IBusEngineService { virtual ~MockIBusEngineService(); // IBusEngineService overrides. - virtual void Initialize(IBusEngineHandlerInterface* handler) OVERRIDE; + virtual void SetEngine(IBusEngineHandlerInterface* handler) OVERRIDE; + virtual void UnsetEngine() OVERRIDE; virtual void RegisterProperties( const ibus::IBusPropertyList& property_list) OVERRIDE; virtual void UpdatePreedit(const ibus::IBusText& ibus_text, |