summaryrefslogtreecommitdiffstats
path: root/chromeos
diff options
context:
space:
mode:
authornona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-23 19:37:41 +0000
committernona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-23 19:37:41 +0000
commit3c30585426cfcf1b7118a62e8939199435cee616 (patch)
tree123bfd8dbe8e379e656a932a30dfca7792a7175c /chromeos
parent27573cfc88abde2ae103901ffdff5f038123555a (diff)
downloadchromium_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.cc11
-rw-r--r--chromeos/dbus/ibus/ibus_engine_service.h5
-rw-r--r--chromeos/dbus/ibus/ibus_engine_service_unittest.cc26
-rw-r--r--chromeos/dbus/ibus/mock_ibus_engine_service.cc2
-rw-r--r--chromeos/dbus/ibus/mock_ibus_engine_service.h2
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,