diff options
author | nona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-23 19:37:41 +0000 |
---|---|---|
committer | nona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-23 19:37:41 +0000 |
commit | 3c30585426cfcf1b7118a62e8939199435cee616 (patch) | |
tree | 123bfd8dbe8e379e656a932a30dfca7792a7175c /chromeos | |
parent | 27573cfc88abde2ae103901ffdff5f038123555a (diff) | |
download | chromium_src-3c30585426cfcf1b7118a62e8939199435cee616.zip chromium_src-3c30585426cfcf1b7118a62e8939199435cee616.tar.gz chromium_src-3c30585426cfcf1b7118a62e8939199435cee616.tar.bz2 |
Fix crash on extension IME reloading on Linux Desktop with chromeos=1.
I found crash is happened when the extension IME reloads on chrome://extensions
page. This crash does not happens on actual chromeos devices and also checked
new implementation does not break existing behaviors.
BUG=None
TEST=Manually checked not crashing on extension reloading both chromeos device
and linux desktop.
Review URL: https://chromiumcodereview.appspot.com/14404007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@195880 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chromeos')
-rw-r--r-- | chromeos/dbus/ibus/ibus_engine_service.cc | 11 | ||||
-rw-r--r-- | chromeos/dbus/ibus/ibus_engine_service.h | 5 | ||||
-rw-r--r-- | chromeos/dbus/ibus/ibus_engine_service_unittest.cc | 26 | ||||
-rw-r--r-- | chromeos/dbus/ibus/mock_ibus_engine_service.cc | 2 | ||||
-rw-r--r-- | chromeos/dbus/ibus/mock_ibus_engine_service.h | 2 |
5 files changed, 24 insertions, 22 deletions
diff --git a/chromeos/dbus/ibus/ibus_engine_service.cc b/chromeos/dbus/ibus/ibus_engine_service.cc index a5e298d..e670398 100644 --- a/chromeos/dbus/ibus/ibus_engine_service.cc +++ b/chromeos/dbus/ibus/ibus_engine_service.cc @@ -142,9 +142,9 @@ class IBusEngineServiceImpl : public IBusEngineService { } // IBusEngineService override. - virtual void UnsetEngine() OVERRIDE { - LOG_IF(ERROR, engine_handler_ == NULL) << "There is no engine."; - engine_handler_ = NULL; + virtual void UnsetEngine(IBusEngineHandlerInterface* handler) OVERRIDE { + if (engine_handler_ == handler) + engine_handler_ = NULL; } // IBusEngineService override. @@ -486,8 +486,9 @@ class IBusEngineServiceDaemonlessImpl : public IBusEngineService { } // IBusEngineService override. - virtual void UnsetEngine() OVERRIDE { - IBusBridge::Get()->SetEngineHandler(NULL); + virtual void UnsetEngine(IBusEngineHandlerInterface* handler) OVERRIDE { + if (IBusBridge::Get()->GetEngineHandler() == handler) + IBusBridge::Get()->SetEngineHandler(NULL); } // IBusEngineService override. diff --git a/chromeos/dbus/ibus/ibus_engine_service.h b/chromeos/dbus/ibus/ibus_engine_service.h index 6dd7f6d..da986d5 100644 --- a/chromeos/dbus/ibus/ibus_engine_service.h +++ b/chromeos/dbus/ibus/ibus_engine_service.h @@ -116,8 +116,9 @@ class CHROMEOS_EXPORT IBusEngineService { // This class doesn't take the ownership of |handler|. virtual void SetEngine(IBusEngineHandlerInterface* handler) = 0; - // Unsets the current IBus engine handler. - virtual void UnsetEngine() = 0; + // Unsets the IBus engine handler if |handler| equals to current engine + // handler. + virtual void UnsetEngine(IBusEngineHandlerInterface* handler) = 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 0df3ffc..90dd53d 100644 --- a/chromeos/dbus/ibus/ibus_engine_service_unittest.cc +++ b/chromeos/dbus/ibus/ibus_engine_service_unittest.cc @@ -539,7 +539,7 @@ TEST_F(IBusEngineServiceTest, FocusInTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, FocusIn()).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); method_callback_map_[ibus::engine::kFocusInMethod].Run( @@ -572,7 +572,7 @@ TEST_F(IBusEngineServiceTest, FocusOutTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, FocusOut()).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); method_callback_map_[ibus::engine::kFocusOutMethod].Run( @@ -605,7 +605,7 @@ TEST_F(IBusEngineServiceTest, EnableTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, Enable()).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); method_callback_map_[ibus::engine::kEnableMethod].Run( @@ -638,7 +638,7 @@ TEST_F(IBusEngineServiceTest, DisableTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, Disable()).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); method_callback_map_[ibus::engine::kDisableMethod].Run( @@ -678,7 +678,7 @@ TEST_F(IBusEngineServiceTest, PropertyActivateTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, PropertyActivate(kPropertyName, kIBusPropertyState)).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); @@ -712,7 +712,7 @@ TEST_F(IBusEngineServiceTest, ResetTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, Reset()).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); method_callback_map_[ibus::engine::kResetMethod].Run( @@ -748,7 +748,7 @@ TEST_F(IBusEngineServiceTest, PropertyShowTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, PropertyShow(kPropertyName)).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); method_callback_map_[ibus::engine::kPropertyShowMethod].Run( @@ -784,7 +784,7 @@ TEST_F(IBusEngineServiceTest, PropertyHideTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, PropertyHide(kPropertyName)).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); method_callback_map_[ibus::engine::kPropertyHideMethod].Run( @@ -821,7 +821,7 @@ TEST_F(IBusEngineServiceTest, SetCapabilityTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, SetCapability(kIBusCapability)).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); method_callback_map_[ibus::engine::kSetCapabilityMethod].Run( @@ -866,7 +866,7 @@ TEST_F(IBusEngineServiceTest, ProcessKeyEventTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, ProcessKeyEvent(kKeySym, kKeyCode, kState, _)).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); @@ -915,7 +915,7 @@ TEST_F(IBusEngineServiceTest, DelayProcessKeyEventTest) { message_loop_.RunUntilIdle(); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, ProcessKeyEvent(kKeySym, kKeyCode, kState, _)).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); @@ -957,7 +957,7 @@ TEST_F(IBusEngineServiceTest, CandidateClickedTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, CandidateClicked(kIndex, kIBusMouseButton, kState)).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); @@ -999,7 +999,7 @@ TEST_F(IBusEngineServiceTest, SetSurroundingTextTest) { base::Unretained(&response_sender))); // Call exported function without engine. - service_->UnsetEngine(); + service_->UnsetEngine(engine_handler_.get()); EXPECT_CALL(*engine_handler_, SetSurroundingText(kText, kCursorPos, kAnchorPos)).Times(0); EXPECT_CALL(response_sender, MockRun(_)).Times(0); diff --git a/chromeos/dbus/ibus/mock_ibus_engine_service.cc b/chromeos/dbus/ibus/mock_ibus_engine_service.cc index b592361..a34dcaf 100644 --- a/chromeos/dbus/ibus/mock_ibus_engine_service.cc +++ b/chromeos/dbus/ibus/mock_ibus_engine_service.cc @@ -15,7 +15,7 @@ MockIBusEngineService::~MockIBusEngineService() { void MockIBusEngineService::SetEngine(IBusEngineHandlerInterface* handler) { } -void MockIBusEngineService::UnsetEngine() { +void MockIBusEngineService::UnsetEngine(IBusEngineHandlerInterface* handler) { } void MockIBusEngineService::RegisterProperties( diff --git a/chromeos/dbus/ibus/mock_ibus_engine_service.h b/chromeos/dbus/ibus/mock_ibus_engine_service.h index 4689c79..a255a27 100644 --- a/chromeos/dbus/ibus/mock_ibus_engine_service.h +++ b/chromeos/dbus/ibus/mock_ibus_engine_service.h @@ -17,7 +17,7 @@ class MockIBusEngineService : public IBusEngineService { // IBusEngineService overrides. virtual void SetEngine(IBusEngineHandlerInterface* handler) OVERRIDE; - virtual void UnsetEngine() OVERRIDE; + virtual void UnsetEngine(IBusEngineHandlerInterface* handler) OVERRIDE; virtual void RegisterProperties( const IBusPropertyList& property_list) OVERRIDE; virtual void UpdatePreedit(const IBusText& ibus_text, |